Estou trabalhando para conseguirexceltexe latexmk
comunicação adicionando dependências personalizadas ao .latexmkrc
.
Pelo que entendi, exceltex
funciona escrevendo uma entrada para cada comando \inctab
/ em um arquivo durante a compilação e usando o script para extrair informações do arquivo. A rotina manual: , , , e funciona. Então acredito que preciso das seguintes relações de dependência:inccell
excltx
Perl
Spreadsheet::ParseExcel
.xls
latexmk
exceltex
latexmk
excltex
exls
: se oxls
arquivo for alterado,exceltex
é invocado.excltex
etex
: se otex
arquivo com\inccell
/\inctab
chamadas for alterado,exceltex
será invocado.
Pelo que entendi, latexmk
não lida com vários arquivos em uma dependência, então primeiro me concentrei em fazer o número 2 funcionar. Eu tentei:
add_cus_dep('excltx', 'tex', 0, 'excel2tex');
sub excel2tex {
system("exceltex \"$_[0].tex\"") ;
}
o que faz latexmk
gerar a seguinte saída:
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.
Minha intenção é que a dependência seja acionada exceltex file.tex
. Por que isso não acontece? Como posso alterar minha dependência para que ela seja executada exceltex
?
Acompanhamento: Supondo que a dependência acima funcione (o que acontece depois de comentar todas as outras dependências .latexmkrc
, executar latexmk
e descomentar as dependências pacificadas), como posso latexmk
executar exceltex
quando o xls
arquivo é alterado? Eu tentei com
add_cus_dep('tex', 'xls', 0, 'excel2tex');
e
add_cus_dep('excltx', 'xls', 0, 'excel2tex');
(e ambos, para garantir). Funciona se eu forçar uma recompilação completa. Com uma compilação normal, onde o conteúdo do tex
documento permanece intacto, mas o xls
arquivo é alterado, latexmk
recusa-se a notar uma alteração apenas no xls
arquivo.
Responder1
Como a dificuldade sobre uma "Possível configuração incorreta ou bug" não pode ser reproduzida agora, podemos ignorar essa parte da questão por enquanto. Responderei o restante da pergunta, que é como criar uma dependência personalizada que será executada se o xls
arquivo for alterado. Aqui está um código testado adequado para um latexmkrc
arquivo:
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]\"") ;
}
O funcionamento é o seguinte: O tex
arquivo principal utiliza o pacote exceltex
para utilizar o conteúdo das células de uma xls
planilha. Isso é feito escrevendo uma especificação das células em um arquivo com extensão excltx
. O script exceltex
lê isso, extrai os dados da(s) planilha(s) e os grava em arquivos que serão lidos durante a próxima compilação do documento principal. (O exceltex
pacote, com seu script, faz parte da versão atual do TeXLive.)
Além de executar o exceltex
script, a sub-rotina definida acima também lê o excltx
arquivo para encontrar os nomes dos arquivos da planilha utilizados. Em seguida, ele usa uma sub-rotina interna latexmk
para adicionar esses arquivos à lista de arquivos de origem da dependência personalizada. Assim se o arquivo (ou arquivos) da planilha for alterado mesmo sem nenhuma outra alteração, latexmk
saberá executar novamente exceltex
e depois recompilar o arquivo principal tex
se necessário.