Я работаю над тем, чтобы получитьexceltexи latexmk
взаимодействие путем добавления пользовательских зависимостей в .latexmkrc
.
Насколько я понимаю, exceltex
работает путем записи записи для каждой команды \inctab
/ в файл при компиляции и использования скрипта для извлечения информации из файла. Ручная процедура: , , , и это работает. Поэтому я считаю, что мне нужны следующие отношения зависимости:inccell
excltx
Perl
Spreadsheet::ParseExcel
.xls
latexmk
exceltex
latexmk
excltex
иxls
: еслиxls
файл изменен,exceltex
вызывается.excltex
иtex
: еслиtex
файл с\inccell
/\inctab
вызывается, изменяется,exceltex
вызывается.
Как я понял, latexmk
не обрабатывает несколько файлов в одной зависимости, поэтому я сначала сосредоточился на том, чтобы заставить работать #2. Я попробовал:
add_cus_dep('excltx', 'tex', 0, 'excel2tex');
sub excel2tex {
system("exceltex \"$_[0].tex\"") ;
}
что позволяет latexmk
сгенерировать следующий вывод:
For rule 'cusdep excltx tex test', running '&do_cusdep( )' ...
Latexmk: Possible misconfiguration or bug:
In trying to apply custom-dependency rule
to make 'test.tex' from 'test.excltx'
the function name is blank.
Мое намерение состоит в том, чтобы зависимость сработала exceltex file.tex
. Почему этого не происходит? Как мне изменить свою зависимость так, чтобы она сработала exceltex
?
Продолжение: Предполагая, что указанная выше зависимость работает (что происходит после комментирования всех других зависимостей в .latexmkrc
, запуска latexmk
и раскомментирования успокоенных зависимостей), как мне сделать latexmk
запуск exceltex
при xls
изменении файла? Я пробовал с
add_cus_dep('tex', 'xls', 0, 'excel2tex');
и
add_cus_dep('excltx', 'xls', 0, 'excel2tex');
(и оба, для пущей убедительности). Работает, если я принудительно выполняю полную перекомпиляцию. При обычной компиляции, когда содержимое документа tex
не трогается, но xls
файл изменяется, latexmk
отказывается замечать изменение только в xls
файле.
решение1
Поскольку проблема с "Возможной неправильной конфигурацией или ошибкой" теперь не может быть воспроизведена, мы можем проигнорировать эту часть вопроса на данный момент. Я отвечу на остальную часть вопроса, а именно, как создать пользовательскую зависимость, которая будет запущена при xls
изменении файла. Вот подходящий протестированный код для latexmkrc
файла:
add_cus_dep('excltx', 'tex', 0, 'excel2tex');
sub excel2tex {
# First find dependency/ies on .xls files, by parsing the .excltx file,
my $Hsource = new FileHandle;
my %xls = ();
my $source = "$_[0].excltx";
if (! open $Hsource, "<$source") {
warn "excel2tex subroutine: Could not read '$source'\n";
return 1;
}
while ( <$Hsource> ) {
if ( /^\s*;/ ) { next; }
if ( /^\s*[ct]:[^:]*\:([^!]*)!/ ) { $xls{$1} = 1; }
}
close $Hsource;
foreach (keys %xls) {
rdb_ensure_file( $rule, $_ );
}
return system("exceltex \"$_[0]\"") ;
}
Функционирование выглядит следующим образом: основной tex
файл использует пакет exceltex
для использования содержимого ячеек в xls
электронной таблице. Он делает это, записывая спецификацию ячеек в файл с расширением excltx
. Скрипт exceltex
считывает его, извлекает данные из электронной таблицы(-ок) и записывает их в файлы, которые считываются во время следующей компиляции основного документа. (Пакет exceltex
с его скриптом является частью текущей версии TeXLive.)
В дополнение к запуску exceltex
скрипта, подпрограмма, определенная выше, также считывает файл, excltx
чтобы найти имена используемых файлов электронных таблиц. Затем она использует внутреннюю подпрограмму для latexmk
добавления этих файлов в список исходных файлов пользовательской зависимости. Таким образом, если файл (или файлы) электронной таблицы изменяется даже без каких-либо других изменений, latexmk
будет известно, что нужно перезапустить exceltex
и затем перекомпилировать основной tex
файл, если это необходимо.