summaryrefslogtreecommitdiff
path: root/support/latexmk/example_rcfiles/xr_latexmkrc
diff options
context:
space:
mode:
Diffstat (limited to 'support/latexmk/example_rcfiles/xr_latexmkrc')
-rw-r--r--support/latexmk/example_rcfiles/xr_latexmkrc85
1 files changed, 85 insertions, 0 deletions
diff --git a/support/latexmk/example_rcfiles/xr_latexmkrc b/support/latexmk/example_rcfiles/xr_latexmkrc
new file mode 100644
index 0000000000..24647ae6e8
--- /dev/null
+++ b/support/latexmk/example_rcfiles/xr_latexmkrc
@@ -0,0 +1,85 @@
+# This shows how to use the xr package with latexmk.
+# John Collins 2023-03-29
+#
+# The xr package ("a system for eXternal References") is used by a document
+# to make references to sections, equations, etc in other external
+# documents.
+# The definitions in this file enable latexmk to apply latexmk to
+# automatically update an external document whenever its .tex file changes,
+# so that the references in the main document stay up to date.
+
+# Notes:
+# 1. This version is defined to put the files from the compilations of
+# the external documents into a defined subdirectory, to segregate
+# potentially many generated files from the main document
+# directories.
+# 2. But for latexmk's custom dependency mechanism to be used, as here,
+# the aux file from compilation of a subdocument must be generated in
+# the same directory as the corresponding source .tex file. So the
+# .aux file is copied.
+# 3. It is assumed that the external documents are to be compiled by
+# pdflatex. This can be changed, of course, by changing the '-pdf'
+# option given to the invoked latexmk to whatever is needed.
+# 4. An ideal implementation would also ensure that recompilation of an
+# external document also happens whenever any of its other source
+# files changes. But this is not done in the present version, and
+# would probably entail either the use of internal latexmk variables
+# or extra enhancements to latexmk.
+# 5. The code uses subroutines copy and fileparse that are loaded by
+# latexmk from the Perl packages File::Copy and File::Basename.
+# 6. It also uses some not-yet-documented features of latexmk: an array
+# variable @file_not_found and subroutines popd, pushd, and
+# rdb_add_generated.
+
+
+#--------------------
+# Configurable choices for compilation of external documents
+
+# Subdirectory for output files from compilation of external documents:
+$sub_doc_output = 'output-subdoc';
+
+# Options to supply to latexmk for compilation of external documents:
+@sub_doc_options = ();
+
+push @sub_doc_options, '-pdf'; # Use pdflatex for compilation of external documents.
+# Replace '-pdf' by '-pdfdvi', 'pdfxe', or 'pdflua' if needed.
+
+#--------------------
+
+# Add a pattern for xr's log-file message about missing files to latexmk's
+# list. Latexmk's variable @file_not_found is not yet documented.
+# This line isn't necessary for v. 4.80 or later of latexmk.
+push @file_not_found, '^No file\\s*(.+)\s*$';
+
+add_cus_dep( 'tex', 'aux', 0, 'makeexternaldocument' );
+sub makeexternaldocument {
+ if ( $root_filename ne $_[0] ) {
+ my ($base_name, $path) = fileparse( $_[0] );
+ pushd $path;
+ my $return = system "latexmk",
+ @sub_doc_options,
+ "-aux-directory=$sub_doc_output",
+ "-output-directory=$sub_doc_output",
+ $base_name;
+ if ( ($sub_doc_output ne ' ') && ($sub_doc_output ne '.') ) {
+ # In this case, .aux file generated by pdflatex isn't in same
+ # directory as the .tex file.
+ # Therefore:
+ # 1. Actual generated aux file must be listed as produced by this
+ # rule, so that latexmk deals with dependencies correctly.
+ # (Problem to overcome: If $sub_dir_output is same as $aux_dir
+ # for the main document, xr may read the .aux file in the
+ # aux_dir rather than the one the cus dep is assumed by latexmk
+ # to produce, which is in the same directory as the .tex source
+ # file for this custom dependency.)
+ # Use not-yet-documented latexmk subroutine rdb_add_generated
+ # to do this:
+ # 2. A copy of the .aux file must be in same directory as .tex file
+ # to satisfy latexmk's definition of a custom dependency.
+ rdb_add_generated( "$sub_doc_output/$base_name.aux" );
+ copy "$sub_doc_output/$base_name.aux", ".";
+ }
+ popd;
+ return $return;
+ }
+}