Pull to refresh

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

Reading time14 min
Views1.8K
Скопировано с моего блога в целях создания еще одного русскоязычного источника информации по данной теме.

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

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

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


Основной особенностью файлов с расширением .js, делающей их интересными в плане применения их в программе LyX, является возможность имитации в этих файлах нажатий клавиш. Именно, рассмотрим, например, как можно сделать так, чтобы в редактируемый в настоящий момент файл .lyx можно было вставлять фото, находящееся в одной папке с этим файлом .lyx (если этот файл еще не сохранен, его окно открыто через Файл>Создать, ну, его окно открыто в первый раз буквально при использовании прогры LyX в этот раз, то вставляемое фото должно находиться в папке, указанной в Инструменты>Настройки...>Пути, в текстовом поле Каталог пользователя) без использования мышки, не отрывая рук от клавы. Основной идеей в решении этой проблемы является следующее. Допустим, в папке, о которой я говорил выше, имеется фото photo.png. Чтобы его вставить в текущее положение курсора в окне программы LyX, можно выполнить в Буфере команды следующую команду:

inset-apply graphics filename photo.png

Таким образом, в файле .js, назовем его vstavka-grafiki.js, нужно будет сымитировать нажатие сочетания клавиш Alt+X (для того, чтобы курсор начал мигать в буфере команды) и нажатие клавиш i, n, s, e, t, -, a, p, p, l, y, Пробел, g, r, a, p, h, i, c, s, Пробел, f, i, l, e, n, a, m, e, Пробел. После этого окно программы LyX начинает выглядеть следующим образом:



При этом, если я сейчас начну что-то вводить с клавы, то это будет вводиться не в основное окно прогры LyX, а в буфер команды, да к тому же буквы будут вводиться с нажимаемых клавиш не те, которые вводятся при нажатии этих клавиш при русской раскладке, а те, которые вводятся при нажатии этих клавиш, когда раскладка клавы переключена на английскую. Отлично, то, что нужно! Но тут, как выяснилось впоследствии, есть одна загвоздка, а именно: сначала я думал прикрутить этот файл .js к прогре LyX через файл default.def, вписав в него строку

\define "vstgr" "vc-command U \"$$p\" \"vstavka-grafiki.js\""

и, создав в программе LyX горячую клавишу на словосочетание call vstgr. Все бы хорошо, но выяснилось, что из программы LyX файлы .js запускать не получается. Зато из нее получается запускать файлы с расширением .bat (банальные батники). Именно поэтому я в файле default.def написал

\define "vstgr" "vc-command U \"$$p\" \"vstavka-grafiki.bat\""

, сделав файл vstavka-grafiki.bat следующего содержания:

start vstavka-grafiki.js

А непосредственно для упрощения вызова созданной мной команды в окне LyX я, как и задумывал, когда еще не знал, что потребуется использовать еще и батник, создал горячую клавишу на словосочетание call vstgr. При этом и файл vstavka-grafiki.bat, и файл vstavka-grafiki.js должны находиться в папке, добавленной в РАТН. Так, идем дальше. При создании формата экспорта pdflatex-v-papke я столкнулся вот с чем. При вставке графики, например, с упомянутым выше именем с расширением photo.png в части окна прогры LyX, появляющейся после нажатия Вид>View Source (или Вид>Просмотреть код — название соответствующего пункта меню Вид зависит от используемого файла локализации .mo) на месте, соответствующем положению вставленной графики в основном окне программы LyX, будет следующий код:

\includegraphics{photo}

И этот же код будет записан в соответствующий файл .tex, появляющийся в соответствующем временном каталоге в результате действия батника, выбранного в качестве движка этого формата на одном из самых первых этапов работы этого батника. Как следствие, в результате выполнения одной из последующих команд этого батника — обработки полученного файла .tex — возникнет ошибка и ничего не получится. А проблема здесь в том, что в образующийся файл .tex имя вставляемого графического файла (аргумент команды \includegraphics) записывается без расширения. Что же делать? Хм, ведь помимо получения файла .tex, обработка которого pdflatex'ом не вызывала бы ни одной ошибки, хотелось бы еще сохранить и наглядность в окне программы LyX. С другой стороны, при вставке графики в окно программы LyX в нашем, русскоязычном случае, символы, вставляемые при нажатии клавиш клавы, будут, скорее всего, кириллическими, в то время, как расширения файлов вообще, в частности, графических, записываются английскими. С другой стороны, читатель, дочитавший этот блог до этого места, уже, скорее всего, знает про весьма вкусную функцию прогры LyX — Использовать раскладку клавиатуры и вовсю ее использует. Что ж, если это так, то задача значительно упрощается. Именно, вот мы открыли файл в программе LyX, переключили раскладку на английскую, а писать мы начали, нажимая буквы, которые нам нужно, так, как будто раскладка поставлена на русскую, символы, которые вводятся в окно программы LyX, — это кириллические символы, расположенные на нажимаемых клавишах. Тут все ОК. Вот мы писали, писали, хоп, нам понадобилось вставить графику. До этого момента вводились кириллические символы, а сейчас нам стало нужным вводить буквы английские (для ввода расширения). Так мы просто-напросто возьмем и перейдем в математический режим, в котором и напишем имя вставляемого фото вместе с его расширением, после этого запустим специально для этого созданной нами горячей клавишей (у меня это Ctrl+0 с цифрового блока клавиатуры+V+G (потому что вставка графики)) специально определенную в файле default.def команду vstgr1.
Определена эта команда так:

\define "vstgr1" "vc-command U \"$$p\" \"vstavka-grafiki1.bat\""

(а предыдущая горячая клавиша назначена на словосочетание call vstgr1). Как нетрудно догадаться, эта команда запускает батник vstavka-grafiki1.bat следующего содержания:

start vstavka-grafiki1.js 

Как нетрудно догадаться, этот батник запускает файл vstavka-grafiki1.js, который, по существу, все и делает. Что же он делает? Давайте сначала я опишу, какую конструкцию мы хотим получить в редактируемом в настоящий момент файле .lyx. Мы хотим, чтобы там с новой строки (если мы там до этого уже что-то написали, если нет, так и не надо новой строки, см. ниже) было вставлено нужное нам фото, потом, опять с новой строки, был бы вставлен блок кода ТеХ (то, что обычно появляется в окне программы LyX при нажатии сочетания клавиш Ctrl+L) и в этом блоке было бы написано \includegraphics{}, где в фигурных скобках стояло бы имя вставляемого фото, потом точка, потом расширение вставляемого фото. По сути, мы делаем, чтобы в окне программы LyX вставляемое фото отображалось только для декорации в окне программы LyX, нам не нужно, чтобы в окончательном .pdf отображалось это фото: в окончательном .pdf будет отображаться фото, которое там появится в результате выполнения команды, стоящей в блоке TеX, поэтому, чтобы предотвратить появления в конечном .pdf графики, возникающей в результате обработки наглядной графики из окна прогры LyX, мы эту наглядную графику в этом окне прогры LyX закомментируем, ставя перед этой наглядной графики знак процента, вставленный в блок кода TеX. Одним словом, мы хотим получить, например, следующую конструкцию:



Я принципиально делаю все то же самое, что и в первом случае: точно так же прикручиваю файл vstavka-grafiki1.bat к LyX'у через файл default.def, создавая в этом файле новую команду vstgr1, а потом создаю в окне программы LyX горячую клавишу на словосочетание call vstgr1, это все понятно. Отличие будет только в файле vstavka-grafiki1.js, который запускается файлом vstavka-grafiki1.bat. Перед тем, как приводить содержание файла vstavka-grafiki1.js, я приведу содержание двух вспомогательных файлов, использующихся в этом файле. А именно, чтобы это все сделать, нам бы потребовалось в том числе в файле vstavka-grafiki1.js сымитировать нажатие знака процента. А, т. к. мы используем казахскую раскладку клавиатуры (я использую казахскую раскладку клавиатуры, потому и пишу, исходя из того, что мой читатель тоже ее использует) и, т. к. при такой раскладке клавиатуры символ, вводимый, к примеру, в блокнот, при нажатии клавиши, на которой расположен этот знак процента, является буквой казахского алфавита, то и в команде, имитирующей нажатие знака процента файла vstavka-grafiki1.js, нам нужно было бы писать эту казахскую букву, что, как я писал в каком-то другом посте этого блога, вызывает ошибку. Поэтому в файле vstavka-grafiki1.js используется батник procent.bat следующего содержания:

echo LYXCMD:vvod:command-sequence:self-insert %%> \\.\pipe\lyxpipe.in

Вспоминая повествование про \\.\pipe\lyxpipe.in, нетрудно понять, что этот батник действительно вставляет знак процента в текущее в прогре LyX положение курсора (естественно, чтобы этим возможно было пользоваться, в Инструменты>Настройки...>Пути в текстовом поле Канал сервера LyX: должно стоять \\.\pipe\lyxpipe, а при попытке использования файла procent.bat в применении к LyX вне файла vstavka-grafiki1.js необходимо соблюдать нужный порядок запуска окна командной строки, из которого будет вызываться файл vstavka-grafiki1.js и окна прогры LyX, в которое этот самый знак процента будет вставляться. За подробностями я отсылаю читателя к упомянутому чуть выше повествованию. Впрочем, при вызове procent.bat из vstavka-grafiki1.js все проходит, как надо). Другим вспомогательным файлом, использующемся в файле vstavka-grafiki1.js, является файл Ostanovka.js следующего содержания:

WshShell=WScript.CreateObject("WScript.Shell")
WshShell.Popup("Если до сих пор все шло правильно, нажмите кнопку \"Ок\", иначе \"Отмена\"", 0, "Контроль процесса",1);

А ето шо за чудо-юдо? Дело в том, что, когда я создавал файл vstavka-grafiki1.js выполняющемся без остановок, во время его работы, видимо, в том числе и из-за запуска из него других файлов с командами, которые должны выполниться в том же окне прогры LyX, в котором файл vstavka-grafiki1.js сам выполняет команды, в разных местах возникали ошибки, эти команды файла vstavka-grafiki1.js в своей совокупности делали не то, что надо. Чтобы это устранить, я придумал вот что. Экспериментально выявлял такие места в файле vstavka-grafiki1.js. Именно, команды в этом файле, вызывающие ошибки. И перед этими местами я хотел приостанавливать работу файла vstavka-grafiki1.js до нажатия мной какой-нибудь клавиши. Какой — еще не знал. Думал я думал и вспомнил, что у команды-не команды, неважно, в общем, у WshShell.Run( есть такой аргумент, что, если его значение указать как true, то при выполнении этой команды работа основного, из которого эта команда выполняется, файла приостанавливается ровно до тех пор, пока не закроется открытый этой командой файл. Что ж, уже кое-что… С другой стороны, я вспомнил, что в jscript есть команда, открывающая диалоговое окно с реально функционирующими кнопками. Сложив все это вместе, я решил перед проблемными местами файла vstavka-grafiki1.js вставлять команду запуска файла Ostanovka.js с параметром ожидания окончания работы этого файла. Файл же Ostanovka.js будет создавать диалоговое окно с двумя кнопками — Ок и Отмена, при этом после выплывания этого окна фокус будет находиться на кнопке Ok, так что, чтобы закрыть это диалоговое окно, достаточно будет нажать клавишу Enter. Итак, файл Ostanovka.js я сделал приведенного мной выше содержания. Я хотел еще на кнопку Отмена навесить еще отмену всех действий, выполненных файлом vstavka-grafiki1.js после последнего запуска файла Ostanovka.js, да пока не знаю, как это сделать. Так, ну, все, после сделанных предварительных замечаний читатель в состоянии понять процесс работы файла vstavka-grafiki1.js. Я буду в комментарии к каждой строке писать, что она выполняет. Не забываем, что перед началом работы файла vstavka-grafiki1.js курсор в окне прогры LyX находится в математическом режиме, после имени вставляемого графического файла, точки, отделяющей его имя от расширения и самого расширения. Именно, я его сделал следующего содержания:

WshShell=WScript.CreateObject("WScript.Shell") 
WshShell.SendKeys("%лч"); 
WshShell.SendKeys("+{HOME}"); //выделяем находящееся в мат. режим имя 
//вставляемой графики, отделенное точкой от его расширения 
WshShell.SendKeys("^с"); //копируем выделение, сделанное на предыдущем шаге 
WshShell.SendKeys("{LEFT}"); //выводим курсор влево из мат. режиме, 
 //про который я писал в комменте к третьей строке 
WshShell.SendKeys("{END}"); //помещаю курсор в положение после 
//мат. режима, про который я писал в комменте к третьей строке 
WshShell.SendKeys("{ENTER}"); //начинаю новую строку под мат. режимом,  
//про который я писал в комменте к третьей строке
WshShell.Run("Ostanovka.js",1,true); //приостанавливаю работу файла 
//vstavka-grafiki1.js
WshShell.SendKeys("^д"); //вставляю блок TeX 
WshShell.SendKeys("^д"); //вставляю блок TeX
WshShell.Run("Ostanovka.js",1,true); //приостанавливаю работу файла 
WshShell.Run("Ostanovka.js",1,true); //приостанавливаю работу файла
//vstavka-grafiki1.js
WshShell.Run("procent.bat"); //вставляю знак процента во вставленный ранее блок TeX 
WshShell.Run("Ostanovka.js",1,true); //приостанавливаю работу файла 
//vstavka-grafiki1.js
WshShell.SendKeys("{RIGHT}"); //выхожу вправо из уже содержащего знак 
//процента блока TeX 
WshShell.SendKeys("%ч"); //перехожу в Буфер команды
WshShell.SendKeys("штыуе-фзздн пкфзршсы ашдутфьу "); //после выполнения 
//этой команды в буфере команды оказывается написано
//inset-apply graphics filename с пробелом после слова filename 
WshShell.SendKeys("^м"); // вставляю в буфер команды из буфера памяти 
//компа скопированное ранее имя вставляемой графики вместе с его расширением, 
//отделенным точкой от имени
WshShell.SendKeys("{ENTER}"); //имитирую нажатие клавиши ENTER, при 
//этом после выполнения этой команды в основном
//окне прогры LyX становится видимо вставляемое фото
//WshShell.SendKeys("{UP}"); //перевожу курсор в основном окне прогры LyX 
//в строку, где стоит имя вставляемого фото вместе с его расширением, 
//находящиеся в мат. режиме, при этом курсор мигает в самом конце этой строки, 
//вне этого мат. режима

WshShell.SendKeys("{LEFT}"); //ввод курсора в мат. режим, про который я 
//писал в комменте к предыдущему шагу
WshShell.SendKeys("+{HOME}"); //выделение имени вставляемого фото, 
//вместе с его расширением, отделенным точкой от его имени
WshShell.SendKeys("^ч"); //вырезание выделения, сделанного на предыдущем шаге 
WshShell.SendKeys("^ч"); //вырезание выделения, сделанного на предыдущем шаге
WshShell.SendKeys("{LEFT}"); //выход влево из опустевшего математического режима 
WshShell.SendKeys("{DELETE}"); //удаление ставшего пустым после 
//вырезания имени вставляемого фото вместе с его расширением, отделенным
//точкой от его имени, математического режима 
WshShell.SendKeys("{DELETE}"); //удаление опустевшей после удаления 
//предыдущим шагом строки
WshShell.SendKeys("{END}"); //после выполнения предыдущей команды курсор 
//перед выполнением этой команды мигает перед знаком процента, находящемся в блоке 
//ТеХ. Так вот, после выполнения этой команды курсор оказывается 
//мигающим в конце этой строки, после ставшей до этого отображаться 
//в окне прогры LyX вставляемого фотки
WshShell.SendKeys("{ENTER}"); //Начало новой строки 
WshShell.SendKeys("^д"); //вставка в начатую предыдущей командой новую строку 
//блока ТеХ
WshShell.SendKeys("\штсдгвупкфзршсы"); //вписывание в блок ТеХ, созданный предыдущей 
//командой, \includegraphics
WshShell.SendKeys("+х"); //дальше вписываем в этот блок ТеХ открывающую 
//фигурную скобку
WshShell.SendKeys("^м"); //вставляем в этот блок ТеХ скопированное ранее имя 
//вставляемой графики вместе с его расширением,
//отделенным точкой от его имени
WshShell.SendKeys("+ъ"); //дальше вписываем в этот блок ТеХ закрывающую 
//фигурную скобку
WshShell.SendKeys("{RIGHT}"); //выводим курсор вправо из блока ТеХ

Скажу еще пару слов по поводу приведенного кода. Во-первых, комментарии в jscript обозначаются знаком // и все, что стоит в строке после этого знака, игнорируется выполнителем этого кода, оно предназначено для объяснения человеку действий, выполняемых этой строкой. А если в строке ничего перед // нет, то эта строка продолжает комментарий, начатый где-то выше. Во-вторых, я в первый раз скопировал имя вставляемого фото вместе с его расширением, отделенным точкой от его имени, а во второй раз вырезал эту конструкцию вместо кажущегося возможным ее вырезанием один раз. Почему? Да потому что, когда я так пытался сделать, перед вставкой в текущее положение этой конструкции из буфера обмена во второй раз, он загадочным образом становился пуст и у меня ничего не выходило. Почему так происходит, я объяснить не могу, однако, я нашел такой выход из возникшей проблемы. Еще раз хочу напомнить, что в процессе работы файла vstavka-grafiki1.js при появлении диалогового окна с заголовком Контроль процесса для продолжения работы файла vstavka-grafiki1.js нужно нажать клавишу Enter (или левой кнопкой мышки нажать какую-нибудь кнопку в выплывшем диалоговом окне, что представляется мне менее удобным).

LyX: Большая буква э


Вот, когда в программе LyX, используемой в том виде, в котором ее создали, нажимаешь сочетание Shift+Э (это я говорю про тот случай, когда при включенной функции Использовать раскладку клавиатуры раскладка клавы переключена на английскую), вместо появления ожидаемой большой буквы «Э», в окне прогры LyX появляется перевернутая верхняя кавычка. Решением этой проблемы является назначение горячей клавиши Shift+" на словосочетание command-sequence self-insert Э.

LyX: Как добавить/убрать сообщкения какой-либо группы сообщений в View Messages


Вот, когда через Вид>View Meseages (или через Вид>Просмотреть сообщения — зависит от используемого файла локализации LyX2.0.mo) открываешь в нижней части окна прогры LyX область Сообщения прогресса/отладки, в этой части окна бывает чрезмерно много выводится сообщений, бывает, просто мышкой пошевелишь, а там выводится километровая последовательность строк, в которой отыскать что-то нужное (например, чтобы получить подсказку, как вводить ту или иную команду через Буфер команды, там оно будет, конечно, не в буквальной форме, но подсказку это дать может, я, быть может, скоро немного об этом расскажу, что мне удалось накопать по этому поводу) бывает крайне затруднительно. Чтобы уменьшить (или, наоборот, добавить сообщения какой-либо группы сообщений), делаем вот что. В той нижней области окна щелкаем левой кнопкой мышки Натройки, там переключатель Отладочные сообщения устанавливаем в Выделенное:



А потом тут же в правой части выполняем двойной щелчок (с такой скоростью, с которой это делается при открытии какого-нибудь файла, эту скорость при необходимости можно изменить в настройках самого компа, вне прогры LyX) по группе сообщений, сообщения из которой мы хотим сделать не отображающимися в области Сообщения прогресса/отладки или, наоборот, сообщения этой группы сообщений мы хотим сделать отображающимися в этой области. После этого двойного щелчка статус группы сообщений, например, Общая информация, Инициализация программы, меняется на противоположный: если до двойного щелчка он был Да, то после этого двойного щелчка он станет Нет и сообщения этой группы перестают отображаться в этой области окна прогры LyX и наоборот. Все, щелкаем по Вывод и наслаждаемся работой в программе, в которой еще один момент удалось настроить так, как нужно нам.

LyX: Документ-потомок


В Вставка>Файл есть команда Дочерний документ.... Оказывается, от этой функции вместе с функцией Preview может быть столько толку… Именно, можно написать, например, в отдельном файле .tex код какого-нибудь чертежа, например, на pstricks. При этом, например, в случае кода на языке pstricks, этот код в файле .tex нужно писать точно так же, как пишутся коды графики на этом языке, когда это происходит не в прогре LyX, а в каком-нибудь «настоящем редакторе LaTeX», например, в TeXworks, т.е. \begin{pspicture}, через пустую строку \end{pspicture}, потом в эту пустую строку пишем нужный нам код, а перед \begin{pspicture} что-то наподобие \psset{xunit=1.0cm,yunit=1.0cm,algebraic=true,dimen=middle,dotstyle=o,dotsize=3pt… ну, те, кто знает pstricks, понимает, о чем я. Все, закрываем файл .tex, сохраняем в нем изменения. Далее переходим к действиям в прогре LyX. Перво-наперво подключаем в Документ>Настройки...>Преамбула LaTeX ровно те пакеты, которые мы бы использовали для этой же цели, если бы это делали в обыкновенном файле .tex, открытым в каком-нибудь «настоящем редакторе LaTeX», далее в LyX нажимаем Вставка>Предварительный просмотр (или Вставка>Preview в зависимости от используемого файла локализации .mo). После этого курсор начинает мигать в черном прямоугольнике. Не выводим курсор из него. Дальше идем в упомянутое выше Вставка>Файл, команда Дочерний документ.... Открывается некоторое диалоговое окно. В этом диалоговом окне делаем вот что: в текстовом поле Файл набираем полный путь к файлу с кодом чертежа .tex, или выбираем его с помощью кнопки Выбрать. В выпадающем списке Тип включения должно быть обязательно выбрано Ввести, иначе ничего не получится, флажок Показать предварительный просмотр устанавливать не обязательно. Таким образом, это диалоговое окно перед нажатием кнопки OK выглядит так:



Все, нажимаем кнопку OK и готово: черный прямоугольник предварительного просмотра исчез, а на месте его стала отображаться графика, образующуюся из кода, находящегося в используемом для построения этой графики файле .tex. Для непосредственной иллюстрации всего сказанного здесь выкладываю папку — вот она — с файлами .lyx и .tex, связанными друг с другом, как описано в этом посте. Следует отметить, что бывали случаи, когда мне после нажатия кнопки OK и вывода курсора из прямоугольника Preview так и не удавалось заставить графику, соответствующую используемому файлу .tex, отображаться в окне прогры LyX. Почему так, я не знаю???

LyX: Задержка дополнения, всплывающего окна


Так, вот, когда мы в математическом режиме начинаем писать какую-либо команды, варианты завершения этой команды:



выпадают не сразу, так что это прилично тормозит работу. Чтобы это устранить, нужно в Инструменты>Настройки...>Дополнения ввода, там, где Общие счетчик Задержка дополнения (сек.) установить в ноль, а чтобы дополнения не задерживались и в обычном тексте, нужно обнулить и счетчик Задержка всплывающего окна (сек.) или наоборот, я не помню точно, какой счетчик за что отвечает, помню только, что при обнулении этих двух счетчиков дополнения и там, и там начинают выскакивать мгновенно. А вообще при мгновенно выскакивающих дополнениях (и в формулах, и в обычном тексте) то место настроек выглядит у меня так:



LyX: Local layout, или локальный формат


Так, в этом разделе мы немного поговорим об изменении в самом окне прогры LyX. Именно, вот, например, в нем числа, нумерующие пункты окружения нумерация, отображаются таким же цветом, как и весь остальной текст, а мы, допустим, хотим сделать их красного цвета, или, например, слово Теорема, появляющееся при переходе в одноименное окружение мы хотим сделать в самом окне прогры LyX пишущимися наклонными, не прямыми, как это обычно, буквами зеленого цвета. А еще предположим, мы хотим сделать буквы обычного текств синими. Мы можем это сделать? Можем. Идем в Документ>Настройки>Локальный макет (в зависимости от используемого файла локализации .mo вместо Локальный макет может стоять Local layout), там пишем вот что:

Provides amsmath 0
 PageStyle plain
 Style Standard
 Font
 Color blue
 EndFont
 End

 Style Enumerate
 Font
 Color red
 EndFont
 End

 Style Theorem
 Font
 Color green
 Shape ital
 EndFont
 End  

Нажимаем кнопку Проверить, через некоторое время, если там все написали как надо, справа от этой кнопки появляется надпись Макет без ошибок!, все, нажимаем кнопку OK (ну, или Применить). Окно прогры LyX начинает выглядеть так:

Tags:
Hubs:
+3
Comments0

Articles

Change theme settings