Ich arbeite daran,exceltexund latexmk
Kommunikation durch Hinzufügen benutzerdefinierter Abhängigkeiten zu .latexmkrc
.
Soweit ich es verstehe, exceltex
funktioniert es, indem beim Kompilieren ein Eintrag für jeden \inctab
/ inccell
-Befehl in eine excltx
Datei geschrieben wird und das Perl
Skript verwendet wird Spreadsheet::ParseExcel
, um Informationen aus der .xls
Datei zu extrahieren. Die manuelle Routine: latexmk
, exceltex
, latexmk
, und es funktioniert. Ich glaube also, dass ich die folgenden Abhängigkeitsbeziehungen brauche:
excltex
und : wird aufgerufen ,xls
wenn diexls
Datei geändert wird .exceltex
excltex
undtex
: wenn sich dietex
Datei mit\inccell
/\inctab
calls ändert,exceltex
wird aufgerufen.
So wie ich es verstanden habe, latexmk
können mehrere Dateien in einer Abhängigkeit nicht verarbeitet werden, also habe ich mich zunächst darauf konzentriert, Nr. 2 zum Laufen zu bringen. Ich habe Folgendes versucht:
add_cus_dep('excltx', 'tex', 0, 'excel2tex');
sub excel2tex {
system("exceltex \"$_[0].tex\"") ;
}
wodurch latexmk
die folgende Ausgabe generiert wird:
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.
Meine Absicht ist, dass die Abhängigkeit ausgelöst wird exceltex file.tex
. Warum passiert das nicht? Wie kann ich meine Abhängigkeit so ändern, dass sie ausgeführt wird exceltex
?
Folgefrage: Angenommen, die obige Abhängigkeit funktioniert (was sie tut, nachdem alle anderen Abhängigkeiten in auskommentiert wurden .latexmkrc
, die befriedeten Abhängigkeiten ausgeführt latexmk
und die Auskommentierung aufgehoben wurden), wie kann ich latexmk
sie ausführen lassen exceltex
, wenn die xls
Datei geändert wird? Ich habe es mit versucht
add_cus_dep('tex', 'xls', 0, 'excel2tex');
Und
add_cus_dep('excltx', 'xls', 0, 'excel2tex');
(und beides, um sicherzugehen). Es funktioniert, wenn ich eine vollständige Neukompilierung erzwinge. Bei einer normalen Kompilierung, bei der der Inhalt des tex
Dokuments unberührt bleibt, aber die xls
Datei geändert wird, latexmk
wird eine Änderung nur in der Datei nicht bemerkt xls
.
Antwort1
Da das Problem mit einer „möglichen Fehlkonfiguration oder einem Fehler“ derzeit nicht reproduziert werden kann, können wir diesen Teil der Frage vorerst ignorieren. Ich werde den Rest der Frage beantworten, nämlich wie man eine benutzerdefinierte Abhängigkeit erstellt, die ausgeführt wird, wenn sich die xls
Datei ändert. Hier ist ein geeigneter getesteter Code für eine latexmkrc
Datei:
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]\"") ;
}
Die Funktionsweise ist wie folgt: Die Hauptdatei tex
verwendet das Paket, exceltex
um den Inhalt von Zellen in einer xls
Tabellenkalkulation zu verwenden. Dies geschieht, indem eine Spezifikation der Zellen in eine Datei mit der Erweiterung geschrieben wird excltx
. Das Skript exceltex
liest diese, extrahiert die Daten aus der/den Tabellenkalkulation(en) und schreibt sie in Dateien, die bei der nächsten Kompilierung des Hauptdokuments gelesen werden. (Das exceltex
Paket mit seinem Skript ist Teil der aktuellen Version von TeXLive.)
Zusätzlich zur Ausführung des exceltex
Skripts liest die oben definierte Subroutine auch die excltx
Datei, um die Namen der verwendeten Tabellenkalkulationsdateien zu finden. Anschließend verwendet sie eine interne Subroutine, um latexmk
diese Dateien zur Quelldateiliste der benutzerdefinierten Abhängigkeit hinzuzufügen. Wenn sich also die Tabellenkalkulationsdatei (oder -dateien) ändert, auch wenn keine anderen Änderungen vorgenommen wurden, latexmk
weiß , dass exceltex
die Hauptdatei erneut ausgeführt und dann tex
bei Bedarf neu kompiliert werden muss.