MathJax

HTML

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 будет отображаться фото, которое там появится в результате выполнения команды, стоящей в блоке $\TeX$, поэтому, чтобы предотвратить появления в конечном .pdf графики, возникающей в результате обработки наглядной графики из окна прогры LyX, мы эту наглядную графику в этом окне прогры LyX закомментируем, ставя перед этой наглядной графики знак процента, вставленный в блок кода $\TeX$. Одним словом, мы хотим получить, например, следующую конструкцию:
Я принципиально делаю все то же самое, что и в первом случае: точно так же прикручиваю файл 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

Вспоминая вот это повествование, нетрудно понять, что этот батник действительно вставляет знак процента в текущее в прогре 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")
$\mbox{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.j после последнего запуска файла Ostanovka.js, да пока не знаю, как это сделать. Спросил на форуме, там сказали, ищите сами Гуглом, а я не знаю, что написать в поиске. Короче, если там помогут, я приведу обновленное содержание файла Ostanovka.js, а пока будем довольствоваться тем, что мне удалось наклепать. Так, ну, все, после сделанных предварительных замечаний читатель в состоянии понять процесс работы файла vstavka-grafiki1.js. Я буду в комментарии к каждой строке писать, что она выполняет. Не забываем, что перед началом работы файла vstavka-grafiki1.js курсор в окне прогры LyX находится в математическом режиме, после имени вставляемого графического файла, точки, отделяющей его имя от расширения и самого расширения. Именно, я его сделал следующего содержания:

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


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

Комментариев нет:

Отправить комментарий

Архив блога