$$i The input file
$$o The output file
$$b The base name (without filename extension) in the LyX temporary directory
$$p The full directory path of the LyX temporary directory
$$r The full pathname to the original LyX file being processed
$$f The filename (without any directory path) of the LyX file.
$$l The `LaTeX name'
это я привожу отрывок из одной части мануала программы LyX. Мы не будем здесь заниматься переводом объяснений значений, смыслов этих переменных, а вместо этого попробуем создать новый формат экспорта (с появлением новой кнопки в Файл>Экспортировать в, в том числе при щелчке по которой мы сможем произвести экспорт в этот формата того файла .lyx, из окна которого этот щелчок был произведен), при экспорте в который во временном каталоге (в котором, например, при экспорте в PDF{pdflatex} образуются файлы, помимо создаваемого .pdf) будет создаваться файл puti.txt, в который будут выведены (все) значения этих переменных. Для этого в папке, которая добавлена в РАТН, создаем файл puti.bat следующего содержания:
cd /d %0\..
echo %1 >puti.txt
echo %2 >>puti.txt
echo %3 >>puti.txt
echo %4 >>puti.txt
echo %5 >>puti.txt
echo %6 >>puti.txt
echo %7 >>puti.txt
echo %8 >>puti.txt
echo %1/%~2 >>puti.txt
Далее, в файл
\Format pdf4 pdf "PDF (XeTeX)" X "pdfview" "" "document,vector,menu=export"
\Format pdf5 pdf "PDF (LuaTeX)" u "pdfview" "" "document,vector,menu=export"
добавим такую строку:
Здесь слово puti задает не файл с кодом, являющийся движком создаваемого формата экспорта, а то, под каким именем будет отображаться кнопка вызова этого формата экспорта в Файл>Экспортировать в, а там, где
\converter pdflatex pdf2 "pdflatex $$i" "latex=pdflatex"
\converter xetex pdf4 "xelatex $$i" "latex=xelatex"
\converter luatex pdf5 "lualatex" "latex=lualatex"
мы после строки, определяющей формат pdf5, добавляем такую строку:
А вот здесь слово puti задает уже файл с кодом, являющийся движком создаваемого формата экспорта. И в этом месте файла lyxrc.defaults уже нужно обязательно указывать расширение этого файла с кодом (в данном случае .bat), иначе ничего работать не будет!. А дальше, как несложно догадаться, указываются параметры, с одной стороны, с которыми будет запускаться этот файл с кодом при начале экспорта в создаваемый формат, а, с другой стороны, называются эти параметре в форме, которую программа LyX знает, и поэтому при вызове этого файла с кодом из открытого в LyX файла, LyX, перед тем, как открыть файл с кодом соответствующей программой с параметрами, некоторые из которых формируются из частей полного пути к экспортируемому файлу, а другие - из полных путей к каким-то значимым папкам системы, выполняет замену этих параметров, названных в такой форме их, так сказать, почти настоящими значениями, уже почти пригодными для применения в командной строке. Почему "почти" станет ясно потом. Все, больше ничего в файле lyxrc.defaults делать не нужно: ни добавлять, там, новый какой-нибудь \editor_alternatives или \viewer_alternatives, или еще что-то в этом духе... Далее, после сохранения измененного таким образом файла lyxrc.defaults и перезапуска программы LyX в Файл>Экспортировать в появляется новая кнопка: Перед тем, как ее нажать, нажмем Вид>View Messages (когда я использовал LyX, установленную из исполняемого файла, скачанного из другого источника, та кнопка называлась Просмотреть сообщения, потому что в той копии программы использовался другой файл локализации .mo), при этом обычно в нижней части окна программы LyX появляется область под названием Сообщения прогресса/отладки. Вот теперь можно нажимать созданную нами кнопку. При этом в области Сообщения прогресса/отладки начинают мелькать, прокручиваясь вниз, инфа о течении процесса экспорта. После окончания такого мелькания ищем путь к временной папке, в которой помещаются попутно возникающие файлы, помимо файла того типа, который требуется получить в одной папке с экспортируемым файлом .lyx. Все такие пути более-менее сходны друг с другом, так что тут ошибки быть не может. К примеру, вот один из таких путей:
Переходим в эту папку. Там будет, среди прочих, находиться файл puti.txt, который мы и задали в качестве выходного для данного формата экспорта. Открыв его, увидим примерно следующее:
newfile2.lyx
newfile2.tex
$$l
newfile2.txt
D:/1-kat-LyX/lyx_tmpdir.gq2748/lyx_tmpbuf2/
C:/DocLyX/
$$s
D:/1-kat-LyX/lyx_tmpdir.gq2748/lyx_tmpbuf2/newfile2/newfile2.lyx
Файл такого содержания образовался при экспорте в созданный мной формат экспорта файла C:\DocLyX\newfile2.lyx. Как видно, даже не все параметры раскрылись в свои значения, что, однако, не мешает созданию еще некоторых форматов экспорта, задуманных мной. Однако тут обнаруживается такая проблема, состоящая в "почти" совместимости с командной строкой, о которой я упоминал выше. Именно: разделителем в полученных таким образом путях в файле выхода .txt является знак
и
, тут все понятно. Настоящее отличие между созданным мной ранее форматом экспорта puti и форматом экспорта, создаваемым сейчас, обусловлено отличием между движками (в данном случае между файлами .bat), который я поставил на тот формат экспорта и который я поставлю на этот формат. Именно, в качестве движка для этого формата я использую файл pdflatex-v-papke.bat следующего содержания:
chcp 1251
echo LYXCMD:sohranenie:buffer-write> \\.\pipe\lyxpipe.in
if exist perehod.bat (goto :vyhod3) else (goto :vhod)
:vhod
echo %1 > put0.txt
echo cd /d %%0\..>> pereim.bat
echo SetLocal EnableExtensions EnableDelayedExpansion>> pereim.bat
echo Set infile=put0.txt>> pereim.bat
echo Set outFile=put.txt>> pereim.bat
echo Set find=/>>pereim.bat
echo Set replace=\>>pereim.bat
echo for /F "UseBackQ delims=" %%%%n in ("%%infile%%") do (>> pereim.bat
echo set "LINE=%%%%n">> pereim.bat
echo set "LINE=!LINE:%%find%%=%%replace%%!">> pereim.bat
echo echo.!LINE!^>^>%%outFile%%>> pereim.bat
echo )>> pereim.bat
echo exit>> pereim.bat
start /b pereim.bat
:vhod1
if exist put.txt (goto :vyhod1) else (goto :vhod1)
:vyhod1
echo chcp 1251 > perehod.bat
echo cd /D^^>>perehod.bat
more < put.txt >> perehod.bat
echo del %~n2.tex>> perehod.bat
echo :vhod2 >> perehod.bat
echo lyx -e latex %~n2.lyx>> perehod.bat
echo if exist %~n2.tex (goto :vyhod2) else (goto :vhod2) >> perehod.bat
echo :vyhod2 >> perehod.bat
echo pdflatex %2 >> perehod.bat
echo taskkill /f /im pdflatex.exe >> perehod.bat
echo exit >> perehod.bat
echo :vhod3
if exist perehod.bat (goto :vyhod3) else (goto :vhod3)
:vyhod3
start perehod.bat
pdflatex %1 rem без этого невозможен просмотр в создавемом на базе этого файла движке
exit.bat
exit
Как работает этот батник? Прежде всего, глядя на то, с какими параметрами я сделал этот батник вызывающимся программой LyX, прописав это в файле lyxrc.defaults, мы видим, что это происходит с параметрами "путь к папке, содержащий экспортируемый файл в специфичной для LyX форме" и "имя экспортируемого файла, но с расширением .tex", причем порядок параметров важен. Итак, этот батник вначале производит переход во временную папку, в которой при экспорте в какой-нибудь "родной формат" образуются сопутствующие файлы. Затем, ввиду возможности наличия в параметрах запуска батника pdflatex-v-papke.bat кириллических букв, мы в окне командной строки, в которой будет выполняться этот батник, меняем кодировку на windows 1251. Потом, пользуясь возможностью прогры LyX быть восприимчивой к командам из командной строки, про которую (возможность) я рассказывал вот здесь, мы, ввиду возможности появления изменений в экспортируемом файле, перед главными действиями с этим файлом, вначале сохраняем экспортируемый файл .lyx командой
, чтобы каждый раз не делать это вручную. Команда
с используемыми в ней метками :vyhod3 и :vhod, стоящими до и после этой команды, сама по себе ничего не создает, а делает вот что. Следующими файлами, появляющимися в соответствующей временной папке в результате работы батника pdflatex-v-papke.bat, являются (в порядке появления) файлы put0.txt, pereim.bat, put.txt, perehod.bat, создавать при каждом предпросмотре, экспорте, во всяком случае, при возможных редактированиях открытого в настоящий момент файла .lyx, не нужно, это нужно только в первый раз. При этом в этот первый раз последним во временном каталоге создастся файл perehod.bat, 3 остальных из этих файлов во временной папке не будут существовать, если в этой папке не будет существовать этого файла. Поэтому-то в условии if мы и пишем существование этого файла. Если, когда батник pdflatex-v-papke.bat начинает работать, в соответствующей временной папке этого файла не существует, батник pdflatex-v-papke.bat идет по ветке, создающей в соответствующей временной папке 4 файла - put0.txt, pereim.bat, put.txt, perehod.bat и переходит к последующим своим командам. Если же эти 4 файла во временном каталоге уже существуют, происходит сразу переход к последующим командам, о которых я говорил в предыдущем предложении. Остановимся подробнее на этих четырех файлах. Т. к. первым параметром, с которым програ LyX запускает файл pdflatex-v-papke.bat, является "путь к папке, содержащий экспортируемый файл в специфичной для LyX форме", то в файл put0.txt будет выводится этот путь, представленный в этой форме. Однако путь в этой форме непригоден для использования в командной строке (там разделителем, так сказать, различных уровней вложенности папок является знак
if exist put.txt (goto :vyhod1) else (goto :vhod1)
:vyhod1
Этим участком кода проверяется наличие файла put.txt во временном каталоге, соответствующем экспортируемому файлу. Если этого файла в этой папке нет, батник возвращается к метке :vhod1 и снова проверяет наличие файла put.txt во временном каталоге, соответствующем экспортируемому файлу и так до тех пор, пока этот файл в этой папке не появится. Как только проверка обнаружит этот файл, происходит выход из цикла и выполнение последующих команд батника pdflatex-v-papke.bat. А следующими этапами работы этого батника является создание в соответствующем временном каталоге батника perehod.bat, ожидание появления этого батника (за это отвечает участок кода
if exist perehod.bat (goto :vyhod3) else (goto :vhod3)
:vyhod3
батника pdflatex-v-papke.bat) и запуск батника perehod.bat. Батник perehod.bat я создаю в отдельном файле потому, что он в процессе своей работы должен перейти по пути, содержащемуся в ранее созданном файле put.txt и этот путь из этого файла еще нужно извлечь, что и делается командой
А вообще, к примеру, содержание файла perehod.bat следующее (при экспортируемом файле C:\DocLyX\newfile2.lyx):
cd /D^
C:\DocLyX\
del newfile2.tex
:vhod2
lyx -e latex newfile2.lyx
if exist newfile2.tex (goto :vyhod2) else (goto :vhod2)
:vyhod2
pdflatex newfile2.tex
taskkill /f /im pdflatex.exe exit
А этот батник что делает? Вначале, ввиду возможности наличия в полном пути к экспортируемому файлу кириллических букв, кодировка командного окна, в котором начинает выполняться батник perehod.bat, переключается на windows 1251. Затем выполняются следующие 2 строки, на самом деле являющимися одной командой. Сцепление этих строк в одну команду выполняется знаком
exit
А зачем этот батник? Дело в том, что, когда я еще экспериментировал с батником puti.bat, я, среди прочих подобных, пробовал не роль движка одного из моих форматов файл puti1.bat, так вот, когда я в этом и в других файлах, используемых для подобных целей, не указывал запуска этого батника, у меня, когда я выполнял в LyX экспорт в соответствующий мной созданный формат, упорно вылезала следующая ошибка: И я никак не мог понять, как от нее избавиться. Потом, чисто случайно, у меня в батнике puti1.bat предпоследней командой оказалась команда запуска какого-то батника. Эта ошибка появляться перестала. Насколько я помню, тот случайный батник своей работой генерировал какие-то файлы. Мне это было не нужно. Тогда я решил попробовать в этот батник поместить какую-нибудь не производящую никакие файлы команду. Попробовал дату. Получилось: ошибка, приведенная на фото, перестала выплывать. Так и оставил. Хотя, хоть убей, не пойму, почему это помогает, а узнать, почему это срабатывает, было бы интересно. Ну, а дальше идет выход из батника pdflatex-v-papke.bat. Вот и все. Так, далее. В TeXworks есть следующий инструмент верстки: Создадим в LyX формат экспорта, который вначале производит экспорт экспортируемого файла .lyx в .tex, а затем на полученный файл .tex будет натравливаться xelatex.exe с опцией -undump=xelatex. При этом все файлы, попутно создающиеся при экспорте в этот формат какого-нибудь файла .lyx, будут помещаться в одну папку с экспортируемым файлом. Действия, полностью аналогичные описанным выше. Этот формат делаем отображающимся в Файл>Экспортировать в... под именем xelatex v papke, ставим на этот формат экспорта движок xelatex-v-papke.bat следующего содержания:
chcp 1251
echo LYXCMD:sohranenie:buffer-write> \\.\pipe\lyxpipe.in
if exist perehod.bat (goto :vyhod3) else (goto :vhod)
:vhod
echo %1 > put0.txt
echo cd /d %%0\..>> pereim.bat
echo SetLocal EnableExtensions EnableDelayedExpansion>> pereim.bat
echo Set infile=put0.txt>> pereim.bat
echo Set outFile=put.txt>> pereim.bat
echo Set find=/>>pereim.bat
echo Set replace=\>>pereim.bat
echo for /F "UseBackQ delims=" %%%%n in ("%%infile%%") do (>> pereim.bat
echo set "LINE=%%%%n">> pereim.bat
echo set "LINE=!LINE:%%find%%=%%replace%%!">> pereim.bat
echo echo.!LINE!^>^>%%outFile%%>> pereim.bat
echo )>> pereim.bat
echo exit>> pereim.bat
start /b pereim.bat
:vhod1
if exist put.tex (goto :vyhod1) else (goto :vhod1)
:vyhod1
echo chcp 1251 > perehod.bat
echo cd /D^^>>perehod.bat
more < put.txt >> perehod.bat
echo del %~n2.tex>> perehod.bat
echo :vhod2 >> perehod.bat
echo lyx -e latex %~n2.lyx>> perehod.bat
echo if exist %~n2.tex (goto :vyhod2) else (goto :vhod2) >> perehod.bat
echo :vyhod2 >> perehod.bat
echo miktex-xetex.exe -undump=xelatex %2 >> perehod.bat
echo taskkill /f /im pdflatex.exe >> perehod.bat
echo exit >> perehod.bat
:vhod3
if exist perehod.bat (goto :vyhod3) else (goto :vhod3)
:vyhod3
start perehod.bat
pdflatex %1 rem без этого невозможен просмотр в создаваемом на базе этого файла движке
exit.bat
exit
Как видно, этот батник имеет точно такую же структуру, что и файл pdflatex-v-papke.bat. Отличие только в одной-единственной команде miktex-xetex.exe -undump=xelatex %2, которой и производится обработка одноименного с экспортируемым в создаваемый сейчас формат файла .tex, который мы уже получили в самом начале этого экспорта. И точно так же в файле lyxrc.defaults мы делаем, чтобы батник xelatex-v-papke.bat запускался с параметрами $$r $$i, указываемыми в файле lyxrc.defaults непременно в этом порядке. Отмечу, что, чтобы этот формат экспорта работал с файлами .lyx, в которых есть кириллические буквы, в преамбуле полученного перед этим файле .tex должна либо отсутствовать опция utf8 в \usepackage[utf8]{inputenc}, либо вообще отсутствовать последняя команда. Последнее (кстати, очень полезная штука: таким образом в недоступной части преамбулы можно удалить inputenc и через Документ>Настройки>Преамбула LaTeX написать так, как нужно по этому поводу) достигается установкой в Документ>Настройки>Язык в переключателе Кодировка значения выпадающего списка Другая (название этого списка зависит от используемого файла локализации .mo) в Юникод (XeTeX) (utf8). В качестве последнего примера рассмотрим создание формата экспорта, при экспорте в который, в зависимости от наличия/отсутствия в экспортируемом файле кода графики Asymptote, выполняется та или иная последовательность команд (pdflatex+asymptote+pdflatex или просто pdflatex). При этом, независимо от того, есть или нет в этом файле код графики Asymptote, все файлы, попутно возникающие при работе TEX, будут образовываться не в соответствующем временном каталоге, а в одной с экспортируемым файлом .lyx папке. При этом, если в экспортируемом файле .lyx все-таки есть код графики Asymptote, в конечном .pdf в месторасположениях, соответствующим месторасположениям кодам графики Asymptote, будет находиться уже готовая соответствующая графика. Перед вставкой в файл .lyx кода Asymptote в место будущего нахождения этого кода вставляем код TEX (
if exist perehod.bat (goto :vyhod6) else (goto :vhod)
:vhod
echo %1 > put0.txt
echo cd /d %%0\..> pereim.bat
echo SetLocal EnableExtensions EnableDelayedExpansion>> pereim.bat
echo Set infile=put0.txt>> pereim.bat
echo Set outFile=put.txt>> pereim.bat
echo Set find=/>>pereim.bat
echo Set replace=\>>pereim.bat
echo for /F "UseBackQ delims=" %%%%n in ("%%infile%%") do (>> pereim.bat
echo set "LINE=%%%%n">> pereim.bat
echo set "LINE=!LINE:%%find%%=%%replace%%!">> pereim.bat
echo echo.!LINE!^>^>%%outFile%%>> pereim.bat
echo )>> pereim.bat
echo exit>> pereim.bat
start /b pereim.bat
:vhod1
if exist put.txt (goto :vyhod1) else (goto :vhod1)
:vyhod1
echo echo LYXCMD:sohranenie:buffer-write^> \\.\pipe\lyxpipe.in >perehod.bat
echo cd /D ^^>>perehod.bat
more < put.txt >> perehod.bat
echo :vhod1>>perehod.bat
echo lyx -e latex %~n2.lyx>> perehod.bat
echo if exist %~n2.tex (goto :vyhod1) else (goto :vhod1)>>perehod.bat
echo :vyhod1>>perehod.bat
echo echo cd /d %%%%0\..^> zamena.bat>>perehod.bat
echo echo chcp 65001^>^> zamena.bat>>perehod.bat
echo echo SetLocal EnableExtensions EnableDelayedExpansion^>^> zamena.bat>>perehod.bat
echo echo Set infile=%~n2.tex^>^> zamena.bat>>perehod.bat
echo echo Set outFile=zameneno.tex^>^> zamena.bat>>perehod.bat
echo echo Set find=ovols^>^>zamena.bat>>perehod.bat
echo echo Set replace=^>^>zamena.bat>>perehod.bat
echo echo for /F "UseBackQ delims=" %%%%%%%%n in ("%%%%infile%%%%") do (^>^>
zamena.bat>>perehod.bat
echo echo set "LINE=%%%%%%%%n"^>^> zamena.bat>>perehod.bat
echo echo set "LINE=!LINE:%%%%find%%%%=%%%%replace%%%%!"^>^> zamena.bat>>perehod.bat
echo echo echo.!LINE!^^^>^^^>%%%%outFile%%%%^>^> zamena.bat>>perehod.bat
echo echo )^>^> zamena.bat>>perehod.bat
echo echo exit^>^> zamena.bat>>perehod.bat
echo :vhod2>>perehod.bat
echo if exist zamena.bat (goto :vyhod2) else (goto :vhod2)>>perehod.bat
echo :vyhod2>>perehod.bat
echo start zamena.bat>>perehod.bat
echo :vhod3>>perehod.bat
echo if exist zameneno.tex (goto :vyhod3) else (goto :vhod3)>>perehod.bat
echo :vyhod3>>perehod.bat
echo del %~n2.tex>>perehod.bat
echo rename zameneno.tex %~n2.tex>>perehod.bat
echo del %~n2.aux>>perehod.bat
echo if exist %~n2-*.asy (goto :vhod4) else (goto :vhod5)>>perehod.bat
echo :vhod4>>perehod.bat
echo del %~n2-*.*>>perehod.bat
echo :vhod5>>perehod.bat
echo pdflatex %2 >> perehod.bat
echo for %%%%f in (%~n2-*.asy) do asy %%%%f >> perehod.bat
echo pdflatex %2 >> perehod.bat
echo exit >> perehod.bat
:vhod6
if exist perehod.bat (goto :vyhod6) else (goto :vhod6)
:vyhod6
start perehod.bat
В принципе, здесь все то же самое. Только файл zamena.bat нужен для замены ovols ничем, т. е. для удаления этого слова-абракадабры. Как обычно, участки кода вида
If exist «такой-то файл»...
:vyhod «с таким же таким-то номером»
служат для, так сказать, приостановки дальнейших действий соответствующего батника до появления «такого-то файла» в рабочей папке этого батника, хотя на самом деле батник продолжает работу.
Комментариев нет:
Отправить комментарий