Как стать автором
Обновить

Таинственная программа LyX. Часть 4

Время на прочтение25 мин
Количество просмотров2K
Скопировано с моего блога в целях создания еще одного русскоязычного источника информации по данной теме.

Эта статья является продолжением следующих статей одного цикла:

статья 1
статья 2
статья 3

LyX: \\.\pipe\lyxpipe


Вообще, эта функция нужна для организации взаимодействия LyX с другими программами. В частности, оказывается, в открытое окно программы LyX можно вводить команды через командную строку! Прежде всего, чтобы это все сработало, в Инструменты>Настройки>Пути в текстовое поле Канал сервера LyX вписываем следующее:

\\.\pipe\lyxpipe

, причем к lyxpipe к окончанию не приписывают ни .in, ни .out. Естественно, жмем Сохранить. Далее, окно программы LyX, в которое возникла потребность вводить команды из окна командной строки, должно быть запущено раньше этой командной строки, из которой будут вводиться команды в это окно программы LyX, иначе ничего не получится. Вот примеры, как нужно писать команды в командной строке, чтобы это получилось:

echo LYXCMD:sohranenie:buffer-write> \\.\pipe\lyxpipe.in
 echo LYXCMD:formula:math-mode:\alpha> \\.\pipe\lyxpipe.in
 echo LYXCMD:vstgrafiki:inset-apply:graphics filename zdes kujut hip-hop.png> \\.\pipe\lyxpipe.in 

На мой взгляд, интерес заслуживает последняя команда. Эта команда вставляет фотку zdes kujut hip-hop.png )), находящуюся в папке, указанной в Инструменты>Настройки...>Пути в текстовом поле Каталог пользователя в открытое (до открытия командной строки) окно программы LyX.

LyX: Прямой и обратный поиск


Как это настраивается, рассказано вот здесь. Я просто расскажу, как это делал я на русском языке. Итак. Мы используем непортабельную версию SumatraPDF. Вот мы ее скачали, установили. Далее в «Пуск>Программы по умолчанию>Сопоставление типов файлов или протоколов отдельным программам» делаем так, чтобы файлы .pdf открывались с помощью SumatraPDF. Затем идем в папку C:\Users\ИВАН\AppData\Roaming\SumatraPDF. Оттуда, следуя совету по приведенной ссылке, скопируем в какое-нибудь место файл SumatraPDF-settings.txt.

Далее нужно было добавить каким-либо способом путь к папке, содержащей открывающий программу SumatraPDF файл (у меня это папка C:\Program Files\SumatraPDF) в РАТН. Я почему-то добавил это в Переменные среды пользователя для ИВАН. Далее, путь к папке, содержащей файл, запускающий программу LyX (у меня это C:\Program Files\LyX 2.0\bin), тоже должен содержаться в РАТН. Далее, пойдем в папку C:\Program Files\SumatraPDF, откроем файл SumatraPDF.exe. В появившемся окне программы SumatraPDF щелкаем левой кнопкой мышки 3 горизонтальные полоски в левом верхнем углу (а, может, угле)) ), далее, Настройки>Расширенные настройки. При этом в блокноте откроется тот самый файл SumatraPDF-settings.txt, копию которого мы до этого поместили в какое-нибудь укромное место, так что теперь с этим файлом мы можем делать все, что нам заблагорассудится. А делать мы станем с ним следующее. Вот список некоторых переменных вместе со своими значениями:

ReuseInstance = true
 ReloadModifiedDocuments = true
 InverseSearchCmdLine = lyxeditor.cmd "%f" %l
 EnableTeXEnhancements = true
 UseTabs = true  

Так вот. В файле SumatraPDF-settings.txt проверяем наличие этих переменных (слов, стоящих слева от знака равенства), если они там есть, мы проверяем совпадения значения (слов, стоящих справа от знака равенства) найденных в этом файле переменных из приведенного списка со значениями таких же переменных из этого списка. Если бы в приведенном списке значение какой-либо переменной отличалось от значения соответствующей переменной, в файле, нужно было бы переделать значение этой переменной на такое же, как из приведенного выше списка. Если бы какой-либо переменной из списка вместе со своим значением не было в файле, нам бы просто нужно было скопировать переменную вместе с ее значением в файл. Ну, лично я ничего не менял в этом файле: все перечисленные в списке переменные уже существовали в файле и всем этим переменным в файле присвоились соответствующие значения, приведенные в списке, непосредственно при установке SumatraPDF. Закрываем, сохраняем изменения. Все, SumatraPDF после этого станет настроена. Переходим к настройке LyX. Итак, открываем программу LyX, если до сих пор она не была открыта или по каким-то причинам была закрыта. Идем в Инструменты>Настройки...>Пути. В текстовое поле Канал сервера LyX вписываем

\\.\pipe\lyxpipe

Далее идем в Инструменты>Настройки...>Обработка файлов>Конверторы. Там в области под словосочетанием Определения конверторов выбираем левой кнопкой мышки LaTeX (pdflatex) -> PDF (pdflatex). Далее удаляем из текстового поля Конвертер его содержимое и вставляем (ну, или вписываем руками) следующее:

pdflatex -interaction=nonstopmode -synctex=1 $$i

А из текстового поля Дополнительно удаляем его содержимое. Нажимаем кнопку Изменить. Затем Сохранить. Повторно заходим в Инструменты>Настройки...>Обработка файлов>Конверторы. Проверяем, сохранились ли настройки. У меня, когда я туда вот сейчас, при работающих в обе стороны поисках, вхожу, после нажатия левой кнопкой мышки LaTeX (pdflatex) -> PDF (pdflatex), то место настроек выглядит так:



Далее идем в Инструменты>Настройки..>Вывод>Общие. Там в текстовое поле Команда PDF вводим следующую команду:

SumatraPDF -forward-search "$$t" $$n "$$o"  

, нажимаем Применить. Таким образом, это место станет выглядеть так:



Пойдем в Инструменты>Настройки..>Обработка файлов>Форматы файлов. Там в выпадающем списке Формат установим, выбирая левой кнопкой мышки значение PDF (pdflatex), в выпадающем списке Просмотрщик значение Задано пользователем, а в текстовое поле справа от этого списка вписываем

SumatraPDF

В настоящий момент там так:



И, наконец, в папке C:\Program Files\LyX 2.0\bin создаем файл с именем lyxeditor и расширением .cmd (по сути, получается, это тот же батник) следующего содержания:

 @echo off
 SETLOCAL enabledelayedexpansion
 set file=%1
 set row=%2
 REM remove quotes from variables
 set file=!file:"=!
 set row=!row:"=!
 %comspec% /q /c (@echo LYXCMD:revdvi:server-goto-file-row:%file% %row%)> \\.\pipe\lyxpipe.in&&type \\.\pipe\lyxpipe.out
 endlocal  

код этого батника я взял отсюда, когда перешел по ссылке на странице на английском языке, содержание которой я здесь пересказываю (ссылка на эту страницу дана мной здесь, только выше). Честно говоря, про создание батника на странице на английском языке рассказано намного раньше, чем это сделано у меня, но какая разница? Кстати, код этого батника натолкнул меня на мысль, как вводить команды в командную строку, чтобы они с этой строки вводились в открытое окно программы LyX, что послужило почвой для написания абзца LyX: \\.\pipe\lyxpipe настоящей статьи. А до этого я пробовал вставлять команды из командной строки в окно программы LyX, беря эти команды из мануала, например, пытался выполнить из командной строки такую команду:

echo "LYXCMD:test:get-xy:" >~/.lyxpipe.in

, но у меня ничего не получалось. Ну, и вот, возвращаясь к поиску, связанному с LyX. Как этим пользоваться? А очень просто. Вот если мы сделали предпросмотр открытого файла .lyx, то при нажатии Навигация>Forward search на короткое время в соответствующем окне SumatraPDF выделяется фиолетовым (по крайней мере, у меня) цветом несколько строк, содержащих то же слово, около соответствующему которому в окне LyX в настоящий момент мигает курсор. При двойном щелчке в окне SumatraPDF фокус переносится в окно LyX и там начинает мигать курсор, при этом при щелчке в разных местах окна SumatraPDF курсор начинает мигать в разных местах окна LyX. Ничего более конкретного о связи положения курсора в LyX со строками, выделяемыми в SumatraPDF, ровно как и о связи положения двойного щелчка в SumatraPDF с местом в окне LyX, в котором начинает мигать курсор, сказать не могу. Так, задача довольно-таки сложная, поэтому давайте я здесь еще приведу перевод той страницы, содержание которой я тут пересказываю, сделанный браузером Гугл: вдруг я что-то упустил. Итак.



Из MyNotes
Обновлено для последней версии 2.3.32019
Пользователям MiKTeX рекомендуется выполнить обновление до последней версии перед установкой LyX 2.3.3+ для Windows. Если у вас есть постоянная установка SumatraPDF, вам нужно только установить -inverse-search ONCE, равно как и с помощью вкладок, нам не нужно тратить время на решение, какой сеанс адресовать. Обратите внимание, что в SumatraPDF можно иметь несколько окон и сессий, но это выходит за рамки этого ответа. InverseSearchCmdLine = постоянно хранится в SumatraPDF-settings.txt. Он не должен настраиваться редактором, если вам не нужно переустанавливать или иным образом заменять SumatraPDF-settings.txt (сделайте резервную копию!)

Настройки в SumatraPDF


Заметное отличие состоит в том, что мы возвращаемся к более стабильному cmd-файлу Okular (Okular использует точно такую ​​же систему вызовов, что и SumatraPDF), что позволяет избежать ненужных вызовов. SumatraPDF должен быть установлен таким образом, чтобы он функционировал из любого системного вызова, как SumatraPDF, это означает, что он должен быть «в пути» (если используется переносная версия, SumatraPDF.exe должен быть временно добавлен в путь пользователя до первого вызова Lyx) Запустите SumatraPDF и перейдите в «Настройки»> «Дополнительные параметры». Это откроет файл SumatraPDF-settings.txt в NotePad, теперь, проверив записи, проверьте или измените следующее.

ReuseInstance = true
ReloadModifiedDocuments = true
InverseSearchCmdLine = lyxeditor.cmd "%f" %l
EnableTeXEnhancements = true
UseTabs = true 

Помните, что %l — это строчная буква L, и не забудьте нажать CTRL + S (Сохранить файл). Если вам нужно добавить c: ... LyX \ bin \ к этому InverseSearchCmdLine, значит, вы неправильно установили LyX. Файл .cmd находится в папке bin, которая ДОЛЖНА быть в системном пути.

Настройки в LyX


Следуйте инструкциям SyncTeX в wiki.lyx.org/LyX/SyncTeX.

«(Примечание: обратный поиск файлов .lyx с пробелами или другими специальными символами в имени файла не всегда работает с таким подходом в некоторых системах Windows)»

Мои заметки из-за этого уникального метода вызова канала [1], используемого LyX в Windows, иногда требуется, чтобы рабочий файл и его путь НЕ ДОЛЖНЫ ИМЕТЬ ПРОБЕЛ, Так что, если это не сработает, вам нужно будет поднять любые проблемы с поддержкой LyX. Если они предоставляют более простой способ вызова активного сеанса LyXserver с удаленным путем в кавычках, то оставьте комментарий ниже. Проблема в том, что LyXserver ожидает два последовательных значения:

1) SyncTeX предоставил .tex имя файла 2), за которым следует номер строки, поэтому, когда имя файла содержит пробелы, первая часть может быть недействительной как имя файла, а вторая часть явно не является числом, Это может работать, если имена файлов анализируются как более старый формат 8.3, но большинство современных файлов Windows используют формат LFN. файл lyxeditor.cmd пытается обойти эти проблемы. Заметные различия по сравнению с любым другим подходом Не добавляйте ненужные и устаревшие -reuse-instance или -inverse-search опции / директивы (они не нужны и замедляют правильный -forward-search запрос.)

Инструменты → Настройки → Путь

  • Добавьте каталог, в котором находится SumatraPDF.exe, в строку префикса PATH. (Это не нужно для постоянной установки, но может помочь для портативного использования).
  • Установите для линии LyXServer pipe \\.\pipe\lyxpipe( НЕ использовать кнопку обзора).

Инструменты → Настройки → Обработка файлов → Конвертеры

  • Выберите формат LaTeX (pdflatex) -> PDF (pdflatex)
  • Установите для конвертера ввода значение pdflatex -interaction=nonstopmode -synctex=1 $$i



  • Нажмите «Изменить» (в противном случае изменение будет отменено).
  • Это изменение необходимо, чтобы MikTeX или TeX Live создали файл FILE.synctex.gz.

Выйдите и вернитесь, чтобы проверить, что он модифицирован, мне потребовалось несколько изменений, чтобы сбросить его и закрепить от одного сеанса к другому.

Инструменты → Настройки → Вывод → Общие.
В разделе «прямой поиск» задайте для команды ввода PDF значение SumatraPDF -forward-search "$$t" $$n "$$o"

Инструменты → Настройки → Обработка файлов → Форматы файлов

  • Выберите формат PDF (pdflatex)
  • Установите для поля «Просмотр» значение «Пользовательский» с помощью команды SumatraPDF
  • Возможно, вам придется закрыть все окна SumatraPDF и использовать «Документ → Просмотр».
  • Вы можете установить команду обратного поиска непосредственно в SumatraPDF, перейдя в «Настройки → Дополнительные параметры», как указано выше, и установить обратный поиск. В этом случае вы уменьшаете команду «Просмотр» до

SumatraPDF



ЛЮБЫЕ проблемы с этим вызовом Inverse Search должны возникать при поддержке Lyx, так как это их рекомендуемый метод, а не мой!

[1] В принципе, использование именованных каналов в памяти ускоряет и уменьшает необходимость вызывать приложение через параметры командной оболочки, однако, подобно методам DDE или D-bus, оно незнакомо большинству пользователей и может быть проблематичным для устранения проблем.

Примечание. Убедитесь, что у lyx открыт файл, Enable Forward/Reverse button is active then compile and view finally right click and select about 6 options downвыполните поиск вперед.

Места не 1 на 1 (страницы могут показаться «выключенными»). Это может помочь увидеть прямой поиск, установив в SumatraPDF-settings.txt

HighlightPermanent = true

Чтобы вернуться на соответствующую страницу, просто дважды щелкните любое место в SumatraPDF, чтобы он вызывал lyxeditor.cmd.


Как видно, здесь имеются-таки некоторые нюансы, неупомянутые мной. Впрочем, мне, когда я это все настраивал, эти нюансы просто не понадобились.

LyX; использование файлов .bat


Несмотря на кажущееся на первый взгляд отсутствие возможности добавления в LyX новых форматов экспорта (насколько я понимаю, например, в TeXworks аналогом такой возможности добавления является возможность создания нового инструмента верстки), в этой программе такая возможность присутствует. Для начала попробуем создать следующий, кажущийся на первый взгляд баловством, формат экспорта. В программе LyX определены следующие переменные PATH:

$$s The LyX system directory (e. g. /usr/share/lyx).
$$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 следующего содержания:

chcp 1251
 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

Далее, в файл C:\Users\ИВАН\AppData\Roaming\LyX2.0\lyxrc.defaults мы, там, где строки

....................................
 \Format pdf4 pdf "PDF (XeTeX)" X "pdfview" "" "document,vector,menu=export"
 \Format pdf5 pdf "PDF (LuaTeX)" u "pdfview" "" "document,vector,menu=export"  

добавим такую строку

\Format pdf6 txt "puti" F "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, добавляем такую строку:

\converter pdflatex pdf6 "puti.bat $$b $$f $$i $$l $$o $$p $$r $$s" ""

А вот здесь слово puti задает уже файл с кодом, являющийся движком создаваемого формата экспорта. И в этом месте файла lyxrc.defaults уже нужно обязательно указывать расширение этого файла с кодом (в данном случае .bat), иначе ничего работать не будет!.. А дальше, как несложно догадаться, указываются параметры, с одной стороны, с которыми будет запускаться этот файл с кодом при начале экспорта в создаваемый формат, а, с другой стороны, называются эти параметре в форме, которую программа LyX знает, и поэтому при вызове этого файла с кодом из открытого в LyX файла, LyX, перед тем, как открыть файл с кодом соответствующей программой с параметрами, некоторые из которых формируются из частей полного пути к экспортируемому файлу, а другие — из полных путей к каким-то значимым папкам системы, выполняет замену этих параметров, названных в такой форме их, так сказать, почти настоящими значениями, уже почти пригодными для применения в командной строке. Почему «почти» станет ясно потом. Все, больше ничего в файле lyxrc.defaults делать не нужно: ни добавлять, там, новый какой-нибудь \editor_alternatives или \viewer_alternatives, или еще что-то в этом духе… Далее, после сохранения измененного таким образом файла lyxrc.defaults и перезапуска программы LyX в Файл>Экспортировать в появляется новая кнопка:



Перед тем, как ее нажать, нажмем Вид>View Messages (когда я использовал LyX, установленную из исполняемого файла, скачанного из другого источника, та кнопка называлась Просмотреть сообщения, потому что в той копии программы использовался другой файл локализации .mo), при этом обычно в нижней части окна программы LyX появляется область под названием Сообщения прогресса/отладки. Вот теперь можно нажимать созданную нами кнопку. При этом в области Сообщения прогресса/отладки начинают мелькать, прокручиваясь вниз, инфа о течении процесса экспорта. После окончания такого мелькания ищем путь к временной папке, в которой помещаются попутно возникающие файлы, помимо файла того типа, который требуется получить в одной папке с экспортируемым файлом .lyx. Все такие пути более-менее сходны друг с другом, так что тут ошибки быть не может. К примеру, вот один из таких путей:

D:\1-kat-LyX\lyx_tmpdir.gq2748\lyx_tmpbuf2  

Переходим в эту папку. Там будет, среди прочих, находиться файл puti.txt, который мы и задали в качестве выходного для данного формата экспорта. Открыв его, увидим примерно следующее:

D:/1-kat-LyX/lyx_tmpdir.gq2748/lyx_tmpbuf2/newfile2
 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 является знак / вместо традиционного, по крайней мере, для Windows, \, так что для того, чтобы была возможность использовать полученный таким образом путь, нужно, скорее всего, в файл с кодом, который предполагается использовать в качестве движка для создаваемого формата экспорта, включить участок для замены / на \. Будем иметь это ввиду в дальнейшем. Сопоставляя порядок перечисления параметров в файле lyxrc.defaults, с которыми я заставляю запускаться (а, быть иожет, и запускиваться)) ) файл puti.bat, сам файл puti.bat с содержимым файла puti.txt, я заключаю, что для создания других форматов экспорта, задуманных мной, мне понадобятся, в принципе, только обозначения двух переменных РАТН в форме, понятной LyX. Это $$i — переменная, которая после подстановки выводит в файл puti.txt имя того файла .tex, который мне нужно получить из редактируемого в настоящий момент файла .lyx, для того, чтобы сразу после этого получения было, на что натравливать тот обрабатывающий файл из арсенала установленной и настроенной программы MiKTeX, который я и наметил для создаваемого мной формата экспорта — всв в полном соответствии с процессом экспорта в имеющиеся изначально, от авторов программы, форматы. В качестве такого обрабатывающего файла можно использовать созданный мной файл с кодом какого-нибудь расширения. И $$r — немного измененный по своей специфике программы LyX путь до папки с тем файлом .lyx, экспортом которого в мой формат я в начале этого экспорта получу файл .tex, о котором я только что говорил. Как видно на приведенном мной фото модифицированного мной меню Экспорт, я на своем компе не ограничился созданием одного нового формата экспорта puti. Остановимся подробнее на этих созданных мной форматах экспорта. Обычно при экспорте в какой-нибудь «родной» формат программы LyX все попутно возникающие при этом файлы помещаются программой LyX в соответствующий временный каталог. Попробуем создать такой формат экспорте, при работе которого эти файлы будут помещаться в одну папку с экспортируемым файлом .lyx. Ну, действия с файлом lyxrc.defaults будут по сути такими же, как действия с этим файлом при создании формата экспорта puti. Так же добавляю в соответствующие места этого файла строки:

\Format pdf7 pdf "pdflatex v papke" F "pdfview" "" "document,vector,menu=export"

и

\converter pdflatex pdf7 "pdflatex-v-papke.bat $$r $$i" ""

, тут все понятно. Настоящее отличие между созданным мной ранее форматом экспорта puti и форматом экспорта, создаваемым сейчас, обусловлено отличием между движками (в данном случае между файлами .bat), который я поставил на тот формат экспорта и который я поставлю на этот формат. Именно, в качестве движка для этого формата я использую файл pdflatex-v-papke.bat следующего содержания:

cd /d %0\..
 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 командой

echo LYXCMD:sohranenie:buffer-write> \\.\pipe\lyxpipe.in

, чтобы каждый раз не делать это вручную. Команда

if exist perehod.bat (goto :vyhod3) else (goto :vhod)

с используемыми в ней метками :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 будет выводится этот путь, представленный в этой форме. Однако путь в этой форме непригоден для использования в командной строке (там разделителем, так сказать, различных уровней вложенности папок является знак / вместо ожидаемого командной строкой знака \). По этой причине следующим этапом работы файла pdflatex-v-papke.bat является создание в том же временном каталоге батника pereim.bat, работа которого заключается в том, чтобы взять содержимое файла put0.txt, заменить в этом содержимом / на \ и записать полученное в файл put1.txt. Следующим действием pdflatex-v-papke.bat является запуск батника pereim.bat. Чтобы при этом не появлялось черное окно выполнения командной строки этого батника, я к команде, запускающей этот батник, добавил ключ /b. Я сделал (не знаю, почему) файл pereim.bat запускающимся в отдельном окне командной строки. Из-за этого, пока он генерирует файл put1.txt, работа основного файла pdflatex-v-papke.bat переходит на следующие этапы, на которых в соответствующем временном каталоге уже предполагается существование файла put1.txt. По этой причине в работе основного файла pdflatex-v-papke.bat может произойти ошибка. Чтобы этого не произошло, следующим действием после запуска батника pereim.bat является зацикливание основного батника таким участком его кода:

:vhod1
 if exist put.txt (goto :vyhod1) else (goto :vhod1)
 :vyhod1  

Этим участком кода проверяется наличие файла put.txt во временном каталоге, соответствующем экспортируемому файлу. Если этого файла в этой папке нет, батник возвращается к метке :vhod1 и снова проверяет наличие файла put.txt во временном каталоге, соответствующем экспортируемому файлу и так до тех пор, пока этот файл в этой папке не появится. Как только проверка обнаружит этот файл, происходит выход из цикла и выполнение последующих команд батника pdflatex-v-papke.bat. А следующими этапами работы этого батника является создание в соответствующем временном каталоге батника perehod.bat, ожидание появления этого батника (за это отвечает участок кода

:vhod3
 if exist perehod.bat (goto :vyhod3) else (goto :vhod3)
 :vyhod3

батника pdflatex-v-papke.bat) и запуск батника perehod.bat. Батник perehod.bat я создаю в отдельном файле потому, что он в процессе своей работы должен перейти по пути, содержащемуся в ранее созданном файле put.txt и этот путь из этого файла еще нужно извлечь, что и делается командой

more < put.txt

А вообще, к примеру, содержание файла perehod.bat следующее (при экспортируемом файле C:\DocLyX\newfile2.lyx):

chcp 1251
 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 строки, на самом деле являющимися одной командой. Сцепление этих строк в одну команду выполняется знаком ^ в конце первой строки. Смысл этой составной команды в том, что работа батника perehod.bat переносится в папку с экспортируемым файлом .lyx. Ключ же /D добавлен потому, что у меня в программе LyX в Инструменты>Настройки...>Пути в текстовом поле Временный каталог выставлено так, что при открытии программы LyX этот Временный каталог создается на диске, отличном от того, в некоторой папке которого обычно запускается командная строка. Далее происходит удаление одноименного с экспортируемым файлом .lyx файла, но с расширением .tex, который, быть может, был получен в одной папке с экспортируемым файлом .lyx при экспортах экспортируемого файла .lyx, произведенных ранее. Далее по идее должен производиться экспорт файла .lyx, с которым мы сейчас возимся, в формат .tex с последующим зацикливанием батника pdflatex-v-papke.bat до появления в соответствующем временном каталоге файла, одноименного с экспортируемым файлом .lyx файла, но с расширением .tex. Однако, при таком порядке команд иногда происходит зацикливание (бесконечное) батника pdflatex-v-papke.bat, потому что одноименного с экспортируемым файлом .lyx файла, но с расширением .tex так и не появилось. Поэтому команду экспорта в .tex лучше поместить после той метки, к которой батник возвращается в случае отсутствия в папке с экспортируемым файлом .lyx файла, одноименного с этим файлом .lyx файла, но с расширением .tex. Ну, а дальше все просто. Происходит обработка pdflatex'ом файла, одноименного с экспортируемым файлом .lyx файла, но с расширением .tex, потом дается команда уничтожение процессов pdflatex, возможно, оставшихся незакрытыми после этой обработки (такое бывает) и закрытие батника perehod.bat. Вернемся к файлу pdflatex-v-papke.bat. Этим батником, после запуска батника perehod.bat, выполняется команда, смысл которой указан в комментарии к этой команде. А вот далее следует запуск совершенно на первый взгляд не нужного батника exit.bat (находящегося в какой-нибудь добавленной в РАТН папке) с еще более странным содержимым

date /t
 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 следующего содержания:

cd /d %0\..
 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 (Ctrl+L), в этот блок кода вставляем какое-нибудь слово-абракадабру, которое точно ни в каком другом месте этого файла .lyx попадаться не будет — условимся использовать для этого какое-нибудь русское слово, записанное для большей сумбурности в обратном порядке. Пусть это слово-абракадабра будет ovols. Пишем это слово-абракадабру во вставленный блок кода TeX, далее в этом блоке TeX вставляем пустую строку, новую строку и в этой новой строке набираем опять слово ovols. В пустую строку между этими ovols'ами вставляем \begin{asy}, 2 новые строки и во второй новой строке вписываем \end{asy}. При желании последовательность этих всех действий можно автоматизировать с помощью файла .js соответствующего содержания. Быть может, потом я об этом напишу подробнее. И, наконец, между этими тегами asy пишем код требуемого рисунка. Выглядеть это, например, может выглядеть так:



слово-абракадабра нужна потому, что, когда я этот прием не использовал, то при просмотре созданного при экспорте в формат pdflatex файла .tex в соответствующем временном каталоге пустые строки, вставляемые до и после окружения asy, исчезали, что приводило к появлению конечного .pdf, отличающегося от того, которое было задумано. Далее, естественно, не забываем подключить пакет asymptote в Документ>Настройки...>Преамбула LaTeX. В файле lyxrc.defaults указываем движок для этого формата все с теми же параметрами $$r $$i. Пришла пора привести код для движка этого формата. Это будет, как всегда, файл .bat. Назовем его pdflatex+asymptote+pdflatex-v-lyx.bat. Как всегда, этот файл должен находиться в папке, добавленной в РАТН. Вот код этого батника:

cd /d %0\..
 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 ничем, т. е. для удаления этого слова-абракадабры. Как обычно, участки кода вида

:vhod «с таким-то номером»
If exist «такой-то файл»...
 :vyhod «с таким же таким-то номером»

служат для, так сказать, приостановки дальнейших действий соответствующего батника до появления «такого-то файла» в рабочей папке этого батника, хотя на самом деле батник продолжает работу.
Теги:
Хабы:
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Публикации