diff options
-rw-r--r-- | Master/texmf-dist/doc/support/latexmk/README | 4 | ||||
-rw-r--r-- | Master/texmf-dist/doc/support/latexmk/latexmk.1 | 83 | ||||
-rwxr-xr-x | Master/texmf-dist/doc/support/latexmk/latexmk.bat | 10 | ||||
-rw-r--r-- | Master/texmf-dist/doc/support/latexmk/latexmk.pdf | bin | 148039 -> 155123 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/support/latexmk/latexmk.txt | 636 | ||||
-rwxr-xr-x | Master/texmf-dist/scripts/latexmk/latexmk.pl | 336 |
6 files changed, 665 insertions, 404 deletions
diff --git a/Master/texmf-dist/doc/support/latexmk/README b/Master/texmf-dist/doc/support/latexmk/README index aa1cc45a7e4..7a3b07a87c4 100644 --- a/Master/texmf-dist/doc/support/latexmk/README +++ b/Master/texmf-dist/doc/support/latexmk/README @@ -1,4 +1,4 @@ -Hi, and thanks for checking out latexmk. (Version 4.01, 24 September 2008) +Hi, and thanks for checking out latexmk. (Version 4.05, 10 April 2009) Latexmk completely automates the process of generating a LaTeX document. Essentially, it is a highly specialized cousin of the general make @@ -88,7 +88,7 @@ I hope you find this useful. John Collins ---------------------------- "latexmk -h" ---------------------------- -Latexmk 4.03: Automatic LaTeX document generation routine +Latexmk 4.05: Automatic LaTeX document generation routine Usage: latexmk [latexmk_options] [filename ...] diff --git a/Master/texmf-dist/doc/support/latexmk/latexmk.1 b/Master/texmf-dist/doc/support/latexmk/latexmk.1 index 25132b0cfee..c50258b3f28 100644 --- a/Master/texmf-dist/doc/support/latexmk/latexmk.1 +++ b/Master/texmf-dist/doc/support/latexmk/latexmk.1 @@ -1,4 +1,4 @@ -.TH LATEXMK 1L "22 December 2008" "" +.TH LATEXMK 1L "10 April 2009" "" .SH NAME latexmk \- generate LaTeX document .SH SYNOPSIS @@ -14,6 +14,9 @@ source file for a document, and it issues the appropriate sequence of commands to generate a .dvi, .ps, .pdf and/or hardcopy version of the document. .PP +By default \fIlatexmk\fR will run the commands necessary to generate a +.dvi file. +.PP \fILatexmk\fR can also be set to run continuously with a suitable previewer. In that case the LaTeX program, etc, are rerun whenever one of the source files is modified, and the previewer automatically @@ -808,9 +811,14 @@ filename specifications is possible. The dvi file filter to be run on the newly produced dvi file before other processing. Equivalent to specifying the \fB-dF\fR option. .TP -.B $dvi_mode [0] +.B $dvi_mode [See below for default] If nonzero, generate a dvi version of the document. Equivalent to the \fB-dvi\fR option. +.PP +The variable $dvi_mode defaults to 0, but if no explicit requests are +made for other types of file (postscript, pdf), then $dvi_mode will be +set to 1. In addition, if a request for a file for which a .dvi file +is a prerequisite, then $dvi_mode will be set to 1. .TP .B $dvi_previewer ["start xdvi %O %S" under UNIX] The command to invoke a dvi-previewer. @@ -979,6 +987,39 @@ but also specify options to the program. E.g., $latex = "latex --src-specials"; .TP +.B %latex_input_extensions +This variable specifies the extensions tried by latexmk when it finds +that a LaTeX run resulted in an error that a file has not been found, +and the file is given without an extension. This typically happens when +LaTeX commands of the form \input{file} or \includegraphics{figure}, +when the relevant source file does not exist. + +In this situation, latexmk searches for custom dependencies to make +the missing file(s), but restricts it to the extensions specified by +the variable %latex_input_extensions. The default extensions are +'tex' and 'eps'. + +(For Perl experts: %latex_input_extensions is a hash whose keys are +the extensions. The values are irrelevant.) Two subroutines are +provided for manipulating this and the related variable +%pdflatex_input_extensions, add_input_ext and remove_input_ext. They +are used as in the following examples are possible lines in an +initialization file: + + remove_input_ext( 'latex', 'tex' ); + +removes the extension 'tex' from latex_input_extensions + + add_input_ext( 'latex', 'asdf' ); + +add the extension 'asdf to latex_input_extensions. (Naturally with +such an extension, you should have made an appropriate custom +dependency for latexmk, and should also have done the appropriate +programming in the LaTeX source file to enable the file to be read. +The standard extensions are handled by LaTeX and its graphics/graphicx +packages. + +.TP .B $latex_silent_switch ["-interaction=batchmode"] Switch(es) for the LaTeX processing program when silent mode is on. Under MS-Windows, the default value is changed to @@ -1054,6 +1095,39 @@ Equivalent to the \fB-pdf-\fR, \fB-pdf\fR, \fB-pdfdvi\fR, The LaTeX processing program in the version that makes a pdf file instead of a dvi file. .TP +.B %pdflatex_input_extensions +This variable specifies the extensions tried by latexmk when it finds +that a pdfLaTeX run resulted in an error that a file has not been found, +and the file is given without an extension. This typically happens when +LaTeX commands of the form \input{file} or \includegraphics{figure}, +when the relevant source file does not exist. + +In this situation, latexmk searches for custom dependencies to make +the missing file(s), but restricts it to the extensions specified by +the variable %pdflatex_input_extensions. The default extensions are +'tex', 'pdf', 'jpg, and 'png'. + +(For Perl experts: %pdflatex_input_extensions is a hash whose keys are +the extensions. The values are irrelevant.) Two subroutines are +provided for manipulating this and the related variable +%latex_input_extensions, add_input_ext and remove_input_ext. They +are used as in the following examples are possible lines in an +initialization file: + + remove_input_ext( 'pdflatex', 'tex' ); + +removes the extension 'tex' from pdflatex_input_extensions + + add_input_ext( 'pdflatex', 'asdf' ); + +add the extension 'asdf to pdflatex_input_extensions. (Naturally with +such an extension, you should have made an appropriate custom +dependency for latexmk, and should also have done the appropriate +programming in the LaTeX source file to enable the file to be read. +The standard extensions are handled by pdflatex and its graphics/graphicx +packages.) + +.TP .B $pdflatex_silent_switch ["-interaction=batchmode"] Switch(es) for the pdflatex program (specified in the variable \fI$pdflatex\fR when silent mode is on. @@ -1121,6 +1195,9 @@ corresponds to the process ID. The first word in the line is numbered .B $postscript_mode [0] If nonzero, generate a postscript version of the document. Equivalent to the \fB-ps\fR option. +.PP +If some other request is made for which a postscript file is needed, +then $postscript_mode will be set to 1. .TP .B $preview_continuous_mode [0] If nonzero, run a previewer to view the document, and @@ -1462,7 +1539,7 @@ e-mail addresses are not written in their standard form to avoid being harvested by worms and viruses.) .SH AUTHOR Current version, by John Collins (username collins at node phys.psu.edu). -(Version 4.03). +(Version 4.05). Released version can be obtained from CTAN: <http://www.tug.org/tex-archive/support/latexmk/>, and from the diff --git a/Master/texmf-dist/doc/support/latexmk/latexmk.bat b/Master/texmf-dist/doc/support/latexmk/latexmk.bat index 48e01d6e5e1..f119082adac 100755 --- a/Master/texmf-dist/doc/support/latexmk/latexmk.bat +++ b/Master/texmf-dist/doc/support/latexmk/latexmk.bat @@ -1,5 +1,5 @@ -Rem Execute latexmk.pl, searching for it in the PATH -Rem Assume perl is in the PATH. If not, you should replace 'perl' by -Rem the full pathname of the perl executable, e.g., 'C:\perl\bin\perl.exe' - -perl -S latexmk.pl %1 %2 %3 %4 %5 %6 %7 %8 %9 +Rem Execute latexmk.pl, searching for it in the PATH
+Rem Assume perl is in the PATH. If not, you should replace 'perl' by
+Rem the full pathname of the perl executable, e.g., 'C:\perl\bin\perl.exe'
+
+perl -S latexmk.pl %1 %2 %3 %4 %5 %6 %7 %8 %9
diff --git a/Master/texmf-dist/doc/support/latexmk/latexmk.pdf b/Master/texmf-dist/doc/support/latexmk/latexmk.pdf Binary files differindex 1220cb0574e..d804f857a68 100644 --- a/Master/texmf-dist/doc/support/latexmk/latexmk.pdf +++ b/Master/texmf-dist/doc/support/latexmk/latexmk.pdf diff --git a/Master/texmf-dist/doc/support/latexmk/latexmk.txt b/Master/texmf-dist/doc/support/latexmk/latexmk.txt index 1e67ad04111..2248a598c3e 100644 --- a/Master/texmf-dist/doc/support/latexmk/latexmk.txt +++ b/Master/texmf-dist/doc/support/latexmk/latexmk.txt @@ -14,6 +14,8 @@ DESCRIPTION and it issues the appropriate sequence of commands to generate a .dvi, .ps, .pdf and/or hardcopy version of the document. + By default latexmk will run the commands necessary to generate a + Latexmk can also be set to run continuously with a suitable previewer. In that case the LaTeX program, etc, are rerun whenever one of the source files is modified, and the previewer automatically updates the @@ -56,8 +58,6 @@ DESCRIPTION Latexmk has the ability to print a banner in gray diagonally across each page when making the postscript file. It can also, if needed, call an external program to do other postprocessing on the generated - files. - @@ -70,6 +70,8 @@ DESCRIPTION LATEXMK(1L) LATEXMK(1L) + files. + Latexmk is highly configurable, both from the command line and in con- figuration files, so that it can accommodate a wide variety of user needs and system configurations. Default values are set according to @@ -122,12 +124,10 @@ LATEXMK OPTIONS AND ARGUMENTS ON COMMAND LINE -bi <intensity> How dark to print the banner message. A decimal number between 0 and 1. 0 is black and 1 is white. The default is 0.95, which - is OK unless your toner cartridge is getting low. - - 22 December 2008 2 + 10 April 2009 2 @@ -136,6 +136,8 @@ LATEXMK OPTIONS AND ARGUMENTS ON COMMAND LINE LATEXMK(1L) LATEXMK(1L) + is OK unless your toner cartridge is getting low. + -bs <scale> A decimal number that specifies how large the banner message will be printed. Experimentation is necessary to get the right @@ -189,11 +191,10 @@ LATEXMK(1L) LATEXMK(1L) -dF Dvi file filtering. The argument to this option is a filter which will generate a filtered dvi file with the extension - ".dviF". All extra processing (e.g. conversion to postscript, - 22 December 2008 3 + 10 April 2009 3 @@ -202,6 +203,7 @@ LATEXMK(1L) LATEXMK(1L) LATEXMK(1L) LATEXMK(1L) + ".dviF". All extra processing (e.g. conversion to postscript, preview, printing) will then be performed on this filtered dvi file. @@ -259,7 +261,7 @@ LATEXMK(1L) LATEXMK(1L) - 22 December 2008 4 + 10 April 2009 4 @@ -322,10 +324,11 @@ LATEXMK(1L) LATEXMK(1L) $lpr_pdf configuration variables to see how to set the commands for printing. + This option is incompatible with the -pv and -pvc options, so it - 22 December 2008 5 + 10 April 2009 5 @@ -334,7 +337,6 @@ LATEXMK(1L) LATEXMK(1L) LATEXMK(1L) LATEXMK(1L) - This option is incompatible with the -pv and -pvc options, so it turns them off. -pdf Generate pdf version of document using pdflatex. @@ -388,19 +390,19 @@ LATEXMK(1L) LATEXMK(1L) viewer will be used. This option is incompatible with the -p and -pvc options, so it turns them off. + -pv- Turn off -pv. - 22 December 2008 6 + 10 April 2009 6 -LATEXMK(1L) LATEXMK(1L) +LATEXMK(1L) LATEXMK(1L) - -pv- Turn off -pv. -pvc Run a file previewer and continually update the .dvi, .ps, and/or .pdf files whenever changes are made to source files (see @@ -454,21 +456,21 @@ LATEXMK(1L) LATEXMK(1L) during this second step. Thus an initialization file specified with the -r option can override both the standard initialization files and previously specified options. But all of these can be + overridden by later options. + The contents of the RC file just comprise a piece of code in the - 22 December 2008 7 + 10 April 2009 7 -LATEXMK(1L) LATEXMK(1L) +LATEXMK(1L) LATEXMK(1L) - overridden by later options. - The contents of the RC file just comprise a piece of code in the Perl programming language (typically a sequence of assignment statements); they are executed when the -r option is encountered during latexmk's parsing of its command line. See the -e option @@ -521,20 +523,19 @@ EXAMPLES keep running, watching for source file changes. + % latexmk -c # remove .aux, .log, .bbl, .blg, .dvi, + .pdf, .ps & .bbl files - 22 December 2008 8 - + 10 April 2009 8 -LATEXMK(1L) LATEXMK(1L) - % latexmk -c # remove .aux, .log, .bbl, .blg, .dvi, - .pdf, .ps & .bbl files +LATEXMK(1L) LATEXMK(1L) CONFIGURATION/INITIALIZATION (RC) FILES @@ -587,21 +588,22 @@ HOW TO SET VARIABLES IN INITIALIZATION FILES for the setting of a numeric variable, and + @default_files = ('paper', 'paper1'); + for the setting of an array of strings. It is possible to append an + item to an array variable as follows: - 22 December 2008 9 + 10 April 2009 9 -LATEXMK(1L) LATEXMK(1L) - @default_files = ('paper', 'paper1'); - for the setting of an array of strings. It is possible to append an - item to an array variable as follows: +LATEXMK(1L) LATEXMK(1L) + push @default_files, 'paper2'; @@ -653,10 +655,15 @@ FORMAT OF COMMAND SPECIFICATIONS %T The name of the primary tex file. + The distinction between %B and %R needs a bit of care, since they are + often the same, but not always. For example on a simple document, the + basename of a bibtex run is the same as for the texfile. But in a doc- + ument with several bibliographies, the bibliography files will have a + variety of names. Since bibtex is invoked with the basename of the - 22 December 2008 10 + 10 April 2009 10 @@ -665,11 +672,6 @@ FORMAT OF COMMAND SPECIFICATIONS LATEXMK(1L) LATEXMK(1L) - The distinction between %B and %R needs a bit of care, since they are - often the same, but not always. For example on a simple document, the - basename of a bibtex run is the same as for the texfile. But in a doc- - ument with several bibliographies, the bibliography files will have a - variety of names. Since bibtex is invoked with the basename of the bibliography file, the setting for the bibtex command should therefore be @@ -721,21 +723,22 @@ LATEXMK(1L) LATEXMK(1L) Using MS-Windows file associations: A useful trick under modern ver- sions of MS-Windows (e.g., WinXP) is to use just the command + $dvi_previewer = 'start %S'; + Under recent versions of MS-Windows, this will cause to be run whatever + program the system has associated with dvi files. (The same applies - 22 December 2008 11 + 10 April 2009 11 -LATEXMK(1L) LATEXMK(1L) - $dvi_previewer = 'start %S'; +LATEXMK(1L) LATEXMK(1L) + - Under recent versions of MS-Windows, this will cause to be run whatever - program the system has associated with dvi files. (The same applies for a postscript viewer and a pdf viewer.) Not using a certain command: If a command is not to be run, the command @@ -788,9 +791,13 @@ LIST OF CONFIGURATION VARIABLES USABLE IN INITIALIZATION FILES and the postscript file is always generated, even if it is newer than the dvi file. + $banner_intensity [0.95] + Equivalent to the -bi option, this is a decimal number between 0 + and 1 that specifies how dark to print the banner message. 0 is - 22 December 2008 12 + + 10 April 2009 12 @@ -799,9 +806,6 @@ LIST OF CONFIGURATION VARIABLES USABLE IN INITIALIZATION FILES LATEXMK(1L) LATEXMK(1L) - $banner_intensity [0.95] - Equivalent to the -bi option, this is a decimal number between 0 - and 1 that specifies how dark to print the banner message. 0 is black, 1 is white. The default is just right if your toner car- tridge isn't running too low. @@ -854,20 +858,20 @@ LATEXMK(1L) LATEXMK(1L) $cleanup_includes_generated [0] If nonzero, specifies that cleanup also deletes files that are detected in log file as being generated (see the \openout lines + in the log file). It will also include files made from these + first generation generated files. - 22 December 2008 13 + 10 April 2009 13 -LATEXMK(1L) LATEXMK(1L) +LATEXMK(1L) LATEXMK(1L) - in the log file). It will also include files made from these - first generation generated files. $cleanup_mode [0] If nonzero, specifies cleanup mode: 1 for full cleanup, 2 for @@ -921,10 +925,13 @@ LATEXMK(1L) LATEXMK(1L) are because @default_files is an array variable, i.e., a sequence of filename specifications is possible. + $dvi_filter [empty] + The dvi file filter to be run on the newly produced dvi file + before other processing. Equivalent to specifying the -dF - 22 December 2008 14 + 10 April 2009 14 @@ -933,65 +940,65 @@ LATEXMK(1L) LATEXMK(1L) LATEXMK(1L) LATEXMK(1L) - $dvi_filter [empty] - The dvi file filter to be run on the newly produced dvi file - before other processing. Equivalent to specifying the -dF option. - $dvi_mode [0] + $dvi_mode [See below for default] If nonzero, generate a dvi version of the document. Equivalent to the -dvi option. + The variable $dvi_mode defaults to 0, but if no explicit requests are + made for other types of file (postscript, pdf), then $dvi_mode will be + set to 1. In addition, if a request for a file for which a .dvi file + is a prerequisite, then $dvi_mode will be set to 1. + $dvi_previewer ["start xdvi %O %S" under UNIX] - The command to invoke a dvi-previewer. [Default is "start" - under MS-WINDOWS; under more recent versions of Windows, this - will cause to be run whatever command the system has associated + The command to invoke a dvi-previewer. [Default is "start" + under MS-WINDOWS; under more recent versions of Windows, this + will cause to be run whatever command the system has associated with .dvi files.] $dvi_previewer_landscape ["start xdvi %O %S"] The command to invoke a dvi-previewer in landscape mode. [Default is "start" under MS-WINDOWS; under more recent versions - of Windows, this will cause to be run whatever command the sys- + of Windows, this will cause to be run whatever command the sys- tem has associated with .dvi files.] $dvipdf ["dvipdf %O %S %D"] Command to convert dvi to pdf file. A common reconfiguration is - to use the dvipdfm command, which needs its arguments in a dif- + to use the dvipdfm command, which needs its arguments in a dif- ferent order: $dvipdf = "dvipdfm %O -o %D %S"; - WARNING: The default dvipdf script generates pdf files with + WARNING: The default dvipdf script generates pdf files with bitmapped fonts, which do not look good when viewed by acroread. - That script should be modified to give dvips the options "-P + That script should be modified to give dvips the options "-P pdf" to ensure that type 1 fonts are used in the pdf file. $dvips ["dvips %O -o %D %S"] - The program to used as a filter to convert a .dvi file to a .ps - file. If pdf is going to be generated from pdf, then the value + The program to used as a filter to convert a .dvi file to a .ps + file. If pdf is going to be generated from pdf, then the value of the $dvips_pdf_switch -- see below -- will be included in the options substituted for "%O". $dvips_landscape ["dvips -tlandscape %O -o %D %S"] - The program to used as a filter to convert a .dvi file to a .ps + The program to used as a filter to convert a .dvi file to a .ps file in landscape mode. $dvips_pdf_switch ["-P pdf"] - Switch(es) for dvips program when pdf file is to be generated + Switch(es) for dvips program when pdf file is to be generated from ps file. $dvips_silent_switch ["-q"] Switch(es) for dvips program when silent mode is on. $dvi_update_command [""] - When the dvi previewer is set to be updated by running a com- - mand, this is the command that is run. See the information for - the variable $dvi_update_method for further information, and see - information on the variable $pdf_update_method for an example + When the dvi previewer is set to be updated by running a com- + mand, this is the command that is run. See the information for - 22 December 2008 15 + 10 April 2009 15 @@ -1000,65 +1007,65 @@ LATEXMK(1L) LATEXMK(1L) LATEXMK(1L) LATEXMK(1L) + the variable $dvi_update_method for further information, and see + information on the variable $pdf_update_method for an example for the analogous case of a pdf previewer. $dvi_update_method [2 under UNIX, 1 under MS-Windows] - How the dvi viewer updates its display when the dvi file has - changed. The values here apply equally to the + How the dvi viewer updates its display when the dvi file has + changed. The values here apply equally to the $pdf_update_method and to the $ps_update_method variables. 0 => update is automatic, 1=> manual update by user, which may only mean a mouse click on the viewer's window or may mean a more serious action. - 2 => Send the signal, whose number is in the variable - $dvi_update_signal. The default value under UNIX is suitable + 2 => Send the signal, whose number is in the variable + $dvi_update_signal. The default value under UNIX is suitable for xdvi. - 3 => Viewer cannot do an update, because it locks the file. + 3 => Viewer cannot do an update, because it locks the file. (As with acroread under MS-Windows.) - 4 => run a command to do the update. The command is speci- + 4 => run a command to do the update. The command is speci- fied by the variable $dvi_update_command. - See information on the variable $pdf_update_method for an exam- + See information on the variable $pdf_update_method for an exam- ple of updating by command. - $dvi_update_signal [Under UNIX: SIGUSR1, which is a system-dependent + $dvi_update_signal [Under UNIX: SIGUSR1, which is a system-dependent value] - The number of the signal that is sent to the dvi viewer when it - is updated by sending a signal -- see the information on the - variable $dvi_update_method. The default value is the one + The number of the signal that is sent to the dvi viewer when it + is updated by sending a signal -- see the information on the + variable $dvi_update_method. The default value is the one appropriate for xdvi on a UNIX system. $fdb_ext ["fdb_latexmk"] - The extension of the file which latexmk generates to contain a - database of information on source files. You will not normally + The extension of the file which latexmk generates to contain a + database of information on source files. You will not normally need to change this. $force_mode [0] - If nonzero, continue processing past minor latex errors includ- + If nonzero, continue processing past minor latex errors includ- ing unrecognized cross references. Equivalent to specifying the -f option. - @generated_exts [( aux , bbl , idx , ind , lof , lot , out , toc , + @generated_exts [( aux , bbl , idx , ind , lof , lot , out , toc , $fdb_ext )] - This contains a list of extensions for files that are generated - during a LaTeX run and that are read in by LaTeX in later runs, + This contains a list of extensions for files that are generated + during a LaTeX run and that are read in by LaTeX in later runs, either directly or indirectly. - This list has two uses: (a) to set the kinds of file to be + This list has two uses: (a) to set the kinds of file to be deleted in a cleanup operation (with the -c, -C, -CA, -g and -gg - options), and (b) in the determination of whether a rerun of + options), and (b) in the determination of whether a rerun of (pdf)LaTeX is needed after a run that gives an error. (Normally, a change of a source file during a run should provoke - a rerun. This includes a file generated by LaTeX, e.g., an aux - file, that is read in on subsequent runs. But after a run that - results in an error, a new run should occur until the user has - made a change in the files. But the user may have corrected an - error in a source .tex file during the run. So latexmk needs to - distinguish user-generated and automatically generated files; it + a rerun. This includes a file generated by LaTeX, e.g., an aux + file, that is read in on subsequent runs. But after a run that + results in an error, a new run should occur until the user has + made a change in the files. But the user may have corrected an - 22 December 2008 16 + 10 April 2009 16 @@ -1067,35 +1074,37 @@ LATEXMK(1L) LATEXMK(1L) LATEXMK(1L) LATEXMK(1L) - determines the automatically generated files as those with + error in a source .tex file during the run. So latexmk needs to + distinguish user-generated and automatically generated files; it + determines the automatically generated files as those with extensions in the list in @generated_exts.) - A convenient way to add an extra extension to the list, without - losing the already defined ones is to use a push command in the + A convenient way to add an extra extension to the list, without + losing the already defined ones is to use a push command in the line in an RC file. E.g., push @generated_exts, "end"; - adds the extension "end" to the list of predefined generated - extensions. (This extension is used by the RevTeX package, for + adds the extension "end" to the list of predefined generated + extensions. (This extension is used by the RevTeX package, for example.) $go_mode [0] - If nonzero, process files regardless of timestamps, and is then + If nonzero, process files regardless of timestamps, and is then equivalent to the -g option. %hash_calc_ignore_pattern !!!This variable is for experts only!!! - The general rule latexmk uses for determining when an extra run - of some program is needed is that one of the source files has - changed. But consider for example a latex package that causes - an encapsulated postscript file (an "eps" file) to be made that - is to be read in on the next run. The file contains a comment - line giving its creation date and time. On the next run the - time changes, latex sees that the eps file has changed, and - therefore reruns latex. This causes an infinite loop, only - exited becaues latexmk has a limit on the number of runs to + The general rule latexmk uses for determining when an extra run + of some program is needed is that one of the source files has + changed. But consider for example a latex package that causes + an encapsulated postscript file (an "eps" file) to be made that + is to be read in on the next run. The file contains a comment + line giving its creation date and time. On the next run the + time changes, latex sees that the eps file has changed, and + therefore reruns latex. This causes an infinite loop, only + exited becaues latexmk has a limit on the number of runs to guard against pathological situations. But the changing line has no real effect, since it is a comment. @@ -1104,28 +1113,26 @@ LATEXMK(1L) LATEXMK(1L) $hash_calc_ignore_pattern{'eps'} = '^%%CreationDate: '; This creates a rule for files with extension .eps about lines to - ignore. The left-hand side is a Perl idiom for setting an item - in a hash. Note that the file extension is specified without a + ignore. The left-hand side is a Perl idiom for setting an item + in a hash. Note that the file extension is specified without a period. The value, on the right-hand side, is a string contain- - ing a regular expresssion. (See documentation on Perl for how - they are to be specified in general.) This particular regular - expression specifies that lines beginning with "%%CreationDate: - " are to be ignored in deciding whether a file of the given + ing a regular expresssion. (See documentation on Perl for how + they are to be specified in general.) This particular regular + expression specifies that lines beginning with "%%CreationDate: + " are to be ignored in deciding whether a file of the given extension .eps has changed. $kpsewhich ["kpsewhich %S"] - The program called to locate a source file when the name alone - is not sufficient. Most filenames used by latexmk have suffi- - cient path information to be found directly. But sometimes, - notably when the file, but not its path is known. The program + The program called to locate a source file when the name alone + is not sufficient. Most filenames used by latexmk have suffi- + cient path information to be found directly. But sometimes, + notably when the file, but not its path is known. The program specified by $kpsewhich is used to find it. - See also the @BIBINPUTS variable for another way that latexmk - also uses to try to locate files; it applies only in the case of - 22 December 2008 17 + 10 April 2009 17 @@ -1134,41 +1141,89 @@ LATEXMK(1L) LATEXMK(1L) LATEXMK(1L) LATEXMK(1L) + See also the @BIBINPUTS variable for another way that latexmk + also uses to try to locate files; it applies only in the case of .bib files. $landscape_mode [0] If nonzero, run in landscape mode, using the landscape mode pre- - viewers and dvi to postscript converters. Equivalent to the -l + viewers and dvi to postscript converters. Equivalent to the -l option. Normally not needed with current previewers. $latex ["latex %O %S"] The LaTeX processing program. Note that as with other programs, - you can use this variable not just to change the name of the + you can use this variable not just to change the name of the program used, but also specify options to the program. E.g., $latex = "latex --src-specials"; + %latex_input_extensions + This variable specifies the extensions tried by latexmk when it + finds that a LaTeX run resulted in an error that a file has not + been found, and the file is given without an extension. This + typically happens when LaTeX commands of the form input{file} or + includegraphics{figure}, when the relevant source file does not + exist. + + In this situation, latexmk searches for custom dependencies to + make the missing file(s), but restricts it to the extensions + specified by the variable %latex_input_extensions. The default + extensions are + + (For Perl experts: %latex_input_extensions is a hash whose keys + are the extensions. The values are irrelevant.) Two subrou- + tines are provided for manipulating this and the related vari- + able %pdflatex_input_extensions, add_input_ext and + remove_input_ext. They are used as in the following examples + are possible lines in an initialization file: + + remove_input_ext( 'latex', 'tex' ); + + removes the extension 'tex' from latex_input_extensions + + add_input_ext( 'latex', 'asdf' ); + + add the extension 'asdf to latex_input_extensions. (Naturally + with such an extension, you should have made an appropriate cus- + tom dependency for latexmk, and should also have done the appro- + priate programming in the LaTeX source file to enable the file + to be read. The standard extensions are handled by LaTeX and + its graphics/graphicx packages. + + $latex_silent_switch ["-interaction=batchmode"] - Switch(es) for the LaTeX processing program when silent mode is - on. Under MS-Windows, the default value is changed to "-inter- - action=batchmode -c-style-errors", as used by MikTeX and fpTeX. + Switch(es) for the LaTeX processing program when silent mode is + on. Under MS-Windows, the default value is changed to "-inter- + action=batchmode -c-style-errors", as used by MikTeX and fpTeX. + + + + + 10 April 2009 18 + + + + + +LATEXMK(1L) LATEXMK(1L) + $lpr ["lpr %O %S" under UNIX/LINUX, "NONE lpr" under MS-WINDOWS] The command to print postscript files. - Under MS-Windows (unlike UNIX/LINUX), there is no standard pro- + Under MS-Windows (unlike UNIX/LINUX), there is no standard pro- gram for printing files. But there are ways you can do it. For example, if you have gsview installed, you could use it with the option "/p": $lpr = '"c:/Program Files/Ghostgum/gsview/gsview32.exe" /p'; - If gsview is installed in a different directory, you will need - to make the appropriate change. Note the combination of single - and double quotes around the name. The single quotes specify - that this is a string to be assigned to the configuration vari- - able $lpr. The double quotes are part of the string passed to - the operating system to get the command obeyed; this is neces- + If gsview is installed in a different directory, you will need + to make the appropriate change. Note the combination of single + and double quotes around the name. The single quotes specify + that this is a string to be assigned to the configuration vari- + able $lpr. The double quotes are part of the string passed to + the operating system to get the command obeyed; this is neces- sary because one part of the command name ("Program Files") con- tains a space which would otherwise be misinterpreted. @@ -1178,108 +1233,143 @@ LATEXMK(1L) LATEXMK(1L) $lpr_pdf ["NONE lpr_pdf"] The printing program to print pdf files. - Under MS-Windows you could set this to use gsview, if it is + Under MS-Windows you could set this to use gsview, if it is installed, e.g., $lpr = '"c:/Program Files/Ghostgum/gsview/gsview32.exe" /p'; - If gsview is installed in a different directory, you will need - to make the appropriate change. Note the double quotes around + If gsview is installed in a different directory, you will need + to make the appropriate change. Note the double quotes around the name: this is necessary because one part of the command name ("Program Files") contains a space which would otherwise be mis- interpreted. + $makeindex ["makeindex %O -o %D %S"] + The index processing program. + $max_repeat [5] + The maximum number of times latexmk will run latex/pdflatex + before deciding that there may be an infinite loop and that it + needs to bail out, rather than rerunning latex/pdflatex again to + resolve cross-references, etc. The default value covers all + normal cases. - 22 December 2008 18 + (Note that the "etc" covers a lot of cases where one run of + latex/pdflatex generates files to be read in on a later run.) + $new_viewer_always [0] + This variable applies to latexmk only in continuous-preview + mode. If $new_viewer_always is 0, latexmk will check for a pre- + viously running previewer on the same file, and if one is run- + ning will not start a new one. If $new_viewer_always is non- + 10 April 2009 19 -LATEXMK(1L) LATEXMK(1L) - $makeindex ["makeindex %O -o %D %S"] - The index processing program. - $max_repeat [5] - The maximum number of times latexmk will run latex/pdflatex - before deciding that there may be an infinite loop and that it - needs to bail out, rather than rerunning latex/pdflatex again to - resolve cross-references, etc. The default value covers all - normal cases. - (Note that the "etc" covers a lot of cases where one run of - latex/pdflatex generates files to be read in on a later run.) +LATEXMK(1L) LATEXMK(1L) - $new_viewer_always [0] - This variable applies to latexmk only in continuous-preview - mode. If $new_viewer_always is 0, latexmk will check for a pre- - viously running previewer on the same file, and if one is run- - ning will not start a new one. If $new_viewer_always is non- - zero, this check will be skipped, and latexmk will behave as if + + zero, this check will be skipped, and latexmk will behave as if no viewer is running. $pdf_mode [0] - If zero, do NOT generate a pdf version of the document. If - equal to 1, generate a pdf version of the document using pdfla- + If zero, do NOT generate a pdf version of the document. If + equal to 1, generate a pdf version of the document using pdfla- tex. If equal to 2, generate a pdf version of the document from the ps file, by using the command specified by the $ps2pdf vari- - able. If equal to 3, generate a pdf version of the document + able. If equal to 3, generate a pdf version of the document from the dvi file, by using the command specified by the $dvipdf variable. Equivalent to the -pdf-, -pdf, -pdfdvi, -pdfps options. $pdflatex ["pdflatex %O %S"] - The LaTeX processing program in the version that makes a pdf + The LaTeX processing program in the version that makes a pdf file instead of a dvi file. + %pdflatex_input_extensions + This variable specifies the extensions tried by latexmk when it + finds that a pdfLaTeX run resulted in an error that a file has + not been found, and the file is given without an extension. + This typically happens when LaTeX commands of the form + input{file} or includegraphics{figure}, when the relevant source + file does not exist. + + In this situation, latexmk searches for custom dependencies to + make the missing file(s), but restricts it to the extensions + specified by the variable %pdflatex_input_extensions. The + default extensions are + + (For Perl experts: %pdflatex_input_extensions is a hash whose + keys are the extensions. The values are irrelevant.) Two sub- + routines are provided for manipulating this and the related + variable %latex_input_extensions, add_input_ext and + remove_input_ext. They are used as in the following examples + are possible lines in an initialization file: + + remove_input_ext( 'pdflatex', 'tex' ); + + removes the extension 'tex' from pdflatex_input_extensions + + add_input_ext( 'pdflatex', 'asdf' ); + + add the extension 'asdf to pdflatex_input_extensions. (Natu- + rally with such an extension, you should have made an appropri- + ate custom dependency for latexmk, and should also have done the + appropriate programming in the LaTeX source file to enable the + file to be read. The standard extensions are handled by pdfla- + tex and its graphics/graphicx packages.) + + $pdflatex_silent_switch ["-interaction=batchmode"] - Switch(es) for the pdflatex program (specified in the variable + Switch(es) for the pdflatex program (specified in the variable $pdflatex when silent mode is on. Under MS-Windows, the default - value is changed to "-interaction=batchmode -c-style-errors", as - used by MikTeX and fpTeX. - $pdf_previewer ["start acroread %O %S"] - The command to invoke a pdf-previewer. [Default is changed to - "start" on MS-WINDOWS; under more recent versions of Windows, - this will cause to be run whatever command the system has asso- - ciated with .pdf files.] - WARNING: Potential problem under MS-Windows: if acroread is used - as the pdf previewer, and it is actually viewing a pdf file, the - pdf file cannot be updated. Thus makes acroread a bad choice of - previewer if you use latexmk's previous-continuous mode (option - -pvc) under MS-windows. This problem does not occur if - ghostview, gv or gsview is used to view pdf files. + 10 April 2009 20 - 22 December 2008 19 +LATEXMK(1L) LATEXMK(1L) + value is changed to "-interaction=batchmode -c-style-errors", as + used by MikTeX and fpTeX. -LATEXMK(1L) LATEXMK(1L) + $pdf_previewer ["start acroread %O %S"] + The command to invoke a pdf-previewer. [Default is changed to + "start" on MS-WINDOWS; under more recent versions of Windows, + this will cause to be run whatever command the system has asso- + ciated with .pdf files.] + WARNING: Potential problem under MS-Windows: if acroread is used + as the pdf previewer, and it is actually viewing a pdf file, the + pdf file cannot be updated. Thus makes acroread a bad choice of + previewer if you use latexmk's previous-continuous mode (option + -pvc) under MS-windows. This problem does not occur if + ghostview, gv or gsview is used to view pdf files. $pdf_update_command [""] - When the pdf previewer is set to be updated by running a com- - mand, this is the command that is run. See the information for + When the pdf previewer is set to be updated by running a com- + mand, this is the command that is run. See the information for the variable $pdf_update_method. $pdf_update_method [1 under UNIX, 3 under MS-Windows] - How the pdf viewer updates its display when the pdf file has - changed. See the information on the variable $dvi_update_method + How the pdf viewer updates its display when the pdf file has + changed. See the information on the variable $dvi_update_method for the codes. (Note that information needs be changed slightly - so that for the value 4, to run a command to do the update, the - command is specified by the variable $pdf_update_command, and - for the value 2, to specify update by signal, the signal is + so that for the value 4, to run a command to do the update, the + command is specified by the variable $pdf_update_command, and + for the value 2, to specify update by signal, the signal is specified by $pdf_update_signal.) Note that acroread under MS-Windows (but not UNIX) locks the pdf @@ -1292,48 +1382,52 @@ LATEXMK(1L) LATEXMK(1L) $pdf_update_method = 4; $pdf_update_command = "xpdf -remote %R -reload"; - The first setting arranges for the xpdf program to be used in - its "remote server mode", with the server name specified as the - rootname of the TeX file. The second setting arranges for + The first setting arranges for the xpdf program to be used in + its "remote server mode", with the server name specified as the + rootname of the TeX file. The second setting arranges for updating to be done in response to a command, and the third set- ting sets the update command. - $pdf_update_signal [Under UNIX: SIGHUP, which is a system-dependent + $pdf_update_signal [Under UNIX: SIGHUP, which is a system-dependent value] - The number of the signal that is sent to the pdf viewer when it - is updated by sending a signal -- see the information on the - variable $pdf_update_method. The default value is the one + The number of the signal that is sent to the pdf viewer when it + is updated by sending a signal -- see the information on the + variable $pdf_update_method. The default value is the one appropriate for gv on a UNIX system. $pid_position[1 under UNIX, -1 under MS-Windows] - The variable $pid_position is used to specify which word in - lines of the output from $pscmd corresponds to the process ID. - The first word in the line is numbered 0. The default value of - 1 (2nd word in line) is correct for Solaris 2.6 and Linux. Set- - ting the variable to -1 is used to indicate that $pscmd is not - to be used. + The variable $pid_position is used to specify which word in + lines of the output from $pscmd corresponds to the process ID. - $postscript_mode [0] - If nonzero, generate a postscript version of the document. - Equivalent to the -ps option. - $preview_continuous_mode [0] - If nonzero, run a previewer to view the document, and continue - running latexmk to keep .dvi up-to-date. Equivalent to the -pvc - option. Which previewer is run depends on the other settings, - see the command line options -view=, and the variable $view. + 10 April 2009 21 - 22 December 2008 20 +LATEXMK(1L) LATEXMK(1L) -LATEXMK(1L) LATEXMK(1L) + The first word in the line is numbered 0. The default value of + 1 (2nd word in line) is correct for Solaris 2.6 and Linux. Set- + ting the variable to -1 is used to indicate that $pscmd is not + to be used. + $postscript_mode [0] + If nonzero, generate a postscript version of the document. + Equivalent to the -ps option. + + If some other request is made for which a postscript file is needed, + then $postscript_mode will be set to 1. + + $preview_continuous_mode [0] + If nonzero, run a previewer to view the document, and continue + running latexmk to keep .dvi up-to-date. Equivalent to the -pvc + option. Which previewer is run depends on the other settings, + see the command line options -view=, and the variable $view. $preview_mode [0] If nonzero, run a previewer to preview the document. Equivalent @@ -1375,6 +1469,17 @@ LATEXMK(1L) LATEXMK(1L) postscript file before other processing. Equivalent to specify- ing the -pF option. + + + 10 April 2009 22 + + + + + +LATEXMK(1L) LATEXMK(1L) + + $ps_previewer ["start gv %O %S", but "start %O %S" under MS-WINDOWS] The command to invoke a ps-previewer. (The default under MS- WINDOWS will cause to be run whatever command the system has @@ -1390,18 +1495,6 @@ LATEXMK(1L) LATEXMK(1L) of gv under different names, e.g., ggv, kghostview, etc, but perhaps not one called gv. - - - - 22 December 2008 21 - - - - - -LATEXMK(1L) LATEXMK(1L) - - $ps_previewer_landscape ["start gv -swap %O %S", but "start %O %S" under MS-WINDOWS] The command to invoke a ps-previewer in landscape mode. @@ -1444,6 +1537,18 @@ LATEXMK(1L) LATEXMK(1L) Directory to store temporary files that latexmk may generate while running. + + + + 10 April 2009 23 + + + + + +LATEXMK(1L) LATEXMK(1L) + + The default under MSWindows (including cygwin), is to set $tmpdir to the value of the first of whichever of the system environment variables TMPDIR or TEMP exists, otherwise to the @@ -1459,16 +1564,6 @@ LATEXMK(1L) LATEXMK(1L) generated is to be used (among dvi, ps and pdf). - - 22 December 2008 22 - - - - - -LATEXMK(1L) LATEXMK(1L) - - CUSTOM DEPENDENCIES In any RC file a set of custom dependencies can be set up to convert a file with one extension to a file with another. An example use of this @@ -1511,6 +1606,18 @@ CUSTOM DEPENDENCIES It is invoked whenever latexmk detects that a run of latex/pdflatex needs to read a file, like a graphics file, whose extension is the to- + + + + 10 April 2009 24 + + + + + +LATEXMK(1L) LATEXMK(1L) + + extension of a custom dependency. Then latexmk examines whether a file exists with the same name, but with the corresponding from-extension, as specified in the custom-dependency rule. If it does, then whenever @@ -1524,18 +1631,6 @@ CUSTOM DEPENDENCIES those without knowledge of the Perl programming language. Of course, experts could do something much more elaborate. - - - - 22 December 2008 23 - - - - - -LATEXMK(1L) LATEXMK(1L) - - One other item in each custom-dependency rule labelled "must" above specifies how the rule should be applied when the source file fails to exist. @@ -1581,27 +1676,27 @@ LATEXMK(1L) LATEXMK(1L) system("fig2dev -Lps '$_[0].fig' '$_[0].eps'"); } - This causes the invocation of the fig2dev program to have quoted file- - names; it should therefore work with filenames containing spaces. How- - ever, not all software deals correctly with filenames that contain - spaces. Moreover, the rules, if any, for quoting filenames vary - between operating systems, command shells and individual pieces of - software, so this code may not always work. - If you use pdflatex instead of latex, then you will probably prefer to - convert your graphics files to pdf format, in which case you would - replace the above code in an initialization file by + 10 April 2009 25 - 22 December 2008 24 +LATEXMK(1L) LATEXMK(1L) -LATEXMK(1L) LATEXMK(1L) + This causes the invocation of the fig2dev program to have quoted file- + names; it should therefore work with filenames containing spaces. How- + ever, not all software deals correctly with filenames that contain + spaces. Moreover, the rules, if any, for quoting filenames vary + between operating systems, command shells and individual pieces of + software, so this code may not always work. + If you use pdflatex instead of latex, then you will probably prefer to + convert your graphics files to pdf format, in which case you would + replace the above code in an initialization file by add_cus_dep( 'fig', 'pdf, 0, 'fig2pdf' ); sub fig2pdf { @@ -1649,25 +1744,27 @@ LATEXMK(1L) LATEXMK(1L) be perpetually out-of-date. This situation, of circular dependencies, is endemic to latex, and latexmk in its current version works correctly with circular dependencies. It examines the contents of the files (by - use of an md5 checksum), and only does a remake when the file contents - have actually changed. - Of course if you choose to write random data to the .nnd (or and .aux - file, etc) that changes on each new run, then you will have a problem. - For real experts: See the %hash_cal_ignore_pattern if you have to deal - with such problems. - Glossaries can be dealt with similarly. + 10 April 2009 26 - 22 December 2008 25 +LATEXMK(1L) LATEXMK(1L) -LATEXMK(1L) LATEXMK(1L) + use of an md5 checksum), and only does a remake when the file contents + have actually changed. + + Of course if you choose to write random data to the .nnd (or and .aux + file, etc) that changes on each new run, then you will have a problem. + For real experts: See the %hash_cal_ignore_pattern if you have to deal + with such problems. + + Glossaries can be dealt with similarly. OLD METHOD OF DEFINING CUSTOM DEPENDENCIES @@ -1718,17 +1815,10 @@ BUGS THANKS TO Authors of previous versions. Many users with their feedback, and especially David Coppit (username david at node coppit.org) who made - many useful suggestions that contributed to version 3, and Herbert - Schulz. (Please note that the e-mail addresses are not written in - their standard form to avoid being harvested by worms and viruses.) - -AUTHOR - Current version, by John Collins (username collins at node - phys.psu.edu). (Version 4.03). - 22 December 2008 26 + 10 April 2009 27 @@ -1737,6 +1827,14 @@ AUTHOR LATEXMK(1L) LATEXMK(1L) + many useful suggestions that contributed to version 3, and Herbert + Schulz. (Please note that the e-mail addresses are not written in + their standard form to avoid being harvested by worms and viruses.) + +AUTHOR + Current version, by John Collins (username collins at node + phys.psu.edu). (Version 4.05). + Released version can be obtained from CTAN: <http://www.tug.org/tex- archive/support/latexmk/>, and from the author's website <http://www.phys.psu.edu/~collins/software/latexmk/>. @@ -1791,10 +1889,6 @@ LATEXMK(1L) LATEXMK(1L) - - - - - 22 December 2008 27 + 10 April 2009 28 diff --git a/Master/texmf-dist/scripts/latexmk/latexmk.pl b/Master/texmf-dist/scripts/latexmk/latexmk.pl index 73dfcb48d49..9e7beb249a1 100755 --- a/Master/texmf-dist/scripts/latexmk/latexmk.pl +++ b/Master/texmf-dist/scripts/latexmk/latexmk.pl @@ -1,22 +1,16 @@ -eval '(exit $?0)' && eval 'exec perl -x -S "$0" ${1+"$@"}' && -eval 'exec perl -x -S "$0" $argv:q' -if 0; +#!/usr/bin/env perl +# On a UNIX-like system, the above enables latexmk to run independently +# of the location of the perl executable. This line relies on the +# existence of the program /usr/bin/env +# If there is a problem for any reason, you can replace the first line of +# this file by: + #!/usr/bin/perl -w -#!/opt/local/bin/perl -w -#!/usr/local/bin/perl -w -# The above code allows this script to be run under UNIX/LINUX without -# the need to adjust the path to the perl program in a "shebang" line. -# (The location of perl changes between different installations, and -# may even be different when several computers running different -# flavors of UNIX/LINUX share a copy of latex or other scripts.) The -# script is started under the default command interpreter sh, and the -# evals in the first two lines restart the script under perl, and work -# under various flavors of sh. The -x switch tells perl to start the -# script at the first #! line containing "perl". The "if 0;" on the -# 3rd line converts the first two lines into a valid perl statement -# that does nothing. -# -# Source of the above: manpage for perlrun + +# with the path of the perl executable adjusted for your system. + + +use warnings; # Delete #??!! when working @@ -34,13 +28,11 @@ if 0; # primary run. Ensure fdb and c. is updated enough etc. # I may have it correct now: fdb_write in makeB # See also routine rdb_update_files_for_rule, and who calls it +# It appears to be unused. What is rationale? # Apparently excess runs of latex after change in .tex file that entails # change in bibliography. -# Now I am missing diagnostics - - ## ???!!!!!!!!!!!!! Should I remove bibtex rule? NO ## ?? Need to set dependence of extra bibtex rules on .bib file ## ?? Put $pass as variable in rule. @@ -148,8 +140,8 @@ if 0; $my_name = 'latexmk'; $My_name = 'Latexmk'; -$version_num = '4.03'; -$version_details = "$My_name, John Collins, 22 December 2008"; +$version_num = '4.05'; +$version_details = "$My_name, John Collins, 10 April 2009"; use Config; @@ -218,6 +210,39 @@ else { ## ## Modification log for 24 Sep 2008 onwards in detail ## +## 10 Apr 2009, John Collins V. 4.05 +## 3 Apr 2009, John Collins Change to a nicer #! line +## 26 Mar 2009, John Collins Case independence for one item in +## @file_not_found +## 6 Mar 2009, John Collins Single %input_extensions variable +## Correct bug in making cusdep for missing +## extensionless file +## 5 Mar 2009, John Collins Get rid of warning about variables used +## only once. +## 25 Feb 2009, John Collins Ensure viewed file type is made. +## Configurable extensions for finding +## cusdep. +## 24 Feb 2009, John Collins V. 4.04 +## Fix problems when using both latex and pdflatex +## 1. In fdb, keep primary rules that have been +## run, even if they are not in use in +## current invocation of latexmk. +## 2. But don't write primary rules if they have +## not been run (i.e., $run_time==0). +## 3. If $run_time==0 for an in-use primary +## rule, i.e., if the rule has not +## been run, then run it +## unconditionally. +## 4. But don't let this apply to other +## rules, since the time-stamp rule +## will normally have been adequate. +## Improved diagnostics on reason for rerun. +## Corrected classify_rules call in pvc. +## In rdb_set_from_logB: when setting +## subsidiary rules after parsing log +## file, this is now done only for the +## currently-being-applied primary rule, +## not for all primary rules. ## 22 Dec 2008, John Collins V. 4.03 ## 22 Dec 2008, John Collins Fix possibility that unwrapping of lines ## in log_file is done incorrectly @@ -374,7 +399,7 @@ $log_wrap = 79; '^\\! LaTeX Error: File `([^\\\']*)\\\' not found\\.', '.*?:\\d*: LaTeX Error: File `([^\\\']*)\\\' not found\\.', '^LaTeX Warning: File `([^\\\']*)\\\' not found', - '^Package .* file `([^\\\']*)\\\' not found', + '^Package .* [fF]ile `([^\\\']*)\\\' not found', ); ## Hash mapping file extension (w/o period, e.g., 'eps') to a single regexp, @@ -406,6 +431,17 @@ $pdflatex = 'pdflatex %O %S'; $latex_silent_switch = '-interaction=batchmode'; $pdflatex_silent_switch = '-interaction=batchmode'; +# %input_extensions maps primary_rule_name to pointer to hash of file extensions +# used for extensionless files specified in the source file by constructs +# like \input{file} \includegraphics{file} +# Could write +#%input_extensions = ( 'latex' => { 'tex' => 1, 'eps' => 1 };, +# 'pdflatex' => { 'tex' => 1, 'pdf' => 1, 'jpg' => 1, 'png' => 1 }; ); +# Instead we'll exercise the user-friendly access routines: +add_input_ext( 'latex', 'tex', 'eps' ); +add_input_ext( 'pdflatex', 'tex', 'jpg', 'pdf' ); +#show_input_ext( 'latex' ); show_input_ext( 'pdflatex' ); + ## Command to invoke bibtex $bibtex = 'bibtex %O %B'; # Switch(es) to make bibtex silent: @@ -1052,8 +1088,7 @@ if (!$TEXINPUTS) { $TEXINPUTS = '.'; } # List of known rules. Rule types: primary, # external (calls program), internal (calls routine), cusdep. -%known_rules = ( 'latex' => 'primary', 'pdflatex' => 'primary', - ); +%possible_primaries = ( 'latex' => 'primary', 'pdflatex' => 'primary' ); %primaries = (); # Hash of rules for primary part of make. Keys are # currently 'latex', 'pdflatex' or both. Value is # currently irrelevant. Use hash for ease of lookup @@ -1072,7 +1107,7 @@ if (!$TEXINPUTS) { $TEXINPUTS = '.'; } %rule_db = (); # Database of all rules: # Hash: rulename -> [array of rule data] # Rule data: - # 0: [ cmd_type, ext_cmd, int_cmd, out_of_date-crit, + # 0: [ cmd_type, ext_cmd, int_cmd, test_kind, # source, dest, base, out_of_date, # out_of_date_user, time_of_last_run ] # where @@ -1092,7 +1127,7 @@ if (!$TEXINPUTS) { $TEXINPUTS = '.'; } # This variable intcmd is a reference to an array, # $$intcmd[0] = internal routine # $$intcmd[1...] = its arguments (if any) - # out_of_date_crit specifies method of determining + # test_kind specifies method of determining # whether a file is out-of-date: # 0 for never # 1 for usual: whether there is a source @@ -1495,6 +1530,14 @@ if ( $view eq "default" ) { if ( $pdf_mode ) { $view = "pdf"; } } +# Make sure we make the kind of file we want to view: +if ($view eq 'dvi') { $dvi_mode = 1; } +if ($view eq 'ps') { $postscript_mode = 1; } +if ( ($view eq 'pdf') && ($pdf_mode == 0) ) { + $pdf_mode = 1; +} + +# Make sure that we make something if all requests are turned off if ( ! ( $dvi_mode || $pdf_mode || $postscript_mode || $printout_mode) ) { print "No specific requests made, so default to dvi by latex\n"; $dvi_mode = 1; @@ -1522,15 +1565,6 @@ if ( length($dvi_filter) != 0 ) { $requested_filerules{'dvi_filter'} = 1; } if ( length($ps_filter) != 0 ) { $requested_filerules{'ps_filter'} = 1; } if ( $banner ) { $requested_filerules{'dvips'} = 1; } -%possible_primaries = (); -foreach (&rdb_possible_primaries) { - $possible_primaries{$_} = 1; -} - -#print "POSSIBLE PRIMARIES: "; -#foreach (keys %possible_primaries ) {print "$_, ";} -#print "\n"; - if ( $pdf_mode == 2 ) { # We generate pdf from ps. Make sure we have the correct kind of ps. @@ -1570,7 +1604,6 @@ foreach $filename ( @file_list ) $failure = 0; # Set nonzero to indicate failure at some point of # a make. Use value as exit code if I exit. $failure_msg = ''; # Indicate reason for failure -#?? Unneeded now: $bibtex_mode = $save_bibtex_mode; if ( $do_cd ) { ($filename, $path) = fileparse( $filename ); @@ -2233,7 +2266,9 @@ sub make_preview_continuousB { local @changed = (); local @disappeared = (); local @no_dest = (); # Non-existent destination files + local @rules_never_run = (); local @rules_to_apply = (); + local $failure = 0; local $runs = 0; local %rules_applied = (); @@ -2361,11 +2396,11 @@ CHANGE: sleep($sleep_time); &rdb_clear_change_record; rdb_recurseA( [@targets], \&rdb_flag_changes_here ); - if ( &rdb_count_changes > 0) { - &rdb_diagnose_changes - unless $silent; -#??? - warn "$My_name: File(s) changed or not used in previous run(s). Remake files.\n"; + if ( &rdb_need_run ) { + if (!$silent) { + warn "$My_name: Need to remake files.\n"; + &rdb_diagnose_changes( ' ' ); + } last WAIT; } # Does this do this job???? @@ -3152,7 +3187,7 @@ CANDIDATE: if ( $misparse > 0 ) { print "$misparse\n"; - print "Apparent input files appearently from misunderstood lines in .log file:\n"; + print "Apparent input files apparently from misunderstood lines in .log file:\n"; foreach ( @misparse ) { print " $_\n"; } } print "Log file shows the following generated files: "; @@ -3583,13 +3618,25 @@ sub rdb_write { &rdb_classify_rules( \%possible_primaries, keys %requested_filerules ); print $out_handle "# Fdb version $fdb_ver\n"; - my @rules = sort( - rdb_accessible( - uniq1( keys %known_rules, keys %current_primaries ))); + my @rules = rdb_accessible( uniq1( keys %possible_primaries ) ) ; + # Separate call to sort. Otherwise rdb_accessible seems to get wrong argument. + @rules = sort( @rules ); rdb_for_some( \@rules, - sub { print $out_handle "[\"$rule\"] $$Prun_time \"$$Psource\" \"$$Pdest\" \"$$Pbase\" \n"; }, - sub { print $out_handle " \"$file\" $$Ptime $$Psize $$Pmd5 \"$$Pfrom_rule\"\n"; }, + sub { + # Omit data on a unused and never-run primary rule: + if ( ($$Prun_time == 0) + && exists( $possible_primaries{$rule} ) + && ! exists( $current_primaries{$rule} ) + ) + { + return; + } + print $out_handle "[\"$rule\"] $$Prun_time \"$$Psource\" \"$$Pdest\" \"$$Pbase\" \n"; + rdb_do_files( + sub { print $out_handle " \"$file\" $$Ptime $$Psize $$Pmd5 \"$$Pfrom_rule\"\n"; } + ); + } ); undef $out_handle; return 1; @@ -3635,11 +3682,9 @@ sub rdb_set_from_logB { if ($diagnostics); rdb_create_rule( $from_rule, 'external', $makeindex, '', 1, $idx_file, $ind_file, $ind_base, 1, 0); - foreach my $primary ( keys %primaries ) { - print " ===Source file '$ind_file' for '$primary'\n" + print " ===Source file '$ind_file' for '$rule'\n" if ($diagnostics > -1); - rdb_ensure_file( $primary, $ind_file, $from_rule ); - } + rdb_ensure_file( $rule, $ind_file, $from_rule ); } if ( ! -e $ind_file ) { # Failure was non-existence of makable file @@ -3666,24 +3711,22 @@ sub rdb_set_from_logB { if ($diagnostics); rdb_ensure_file( $from_rule, $source ); } - foreach my $primary ( keys %primaries ) { - print " ===Source file '$bbl_file' for '$primary'\n" + print " ===Source file '$bbl_file' for '$rule'\n" if ($diagnostics); - rdb_ensure_file( $primary, $bbl_file, $from_rule ); - if ( ! -e $bbl_file ) { - # Failure was non-existence of makable file - # Leave failure issue to other rules. - $failure = 0; - } + rdb_ensure_file( $rule, $bbl_file, $from_rule ); + if ( ! -e $bbl_file ) { + # Failure was non-existence of makable file + # Leave failure issue to other rules. + $failure = 0; } } } NEW_SOURCE: foreach my $new_source (keys %dependents) { - foreach my $primary ( keys %primaries ) { - rdb_ensure_file( $primary, $new_source ); - } + print " ===Source file for rule '$rule': '$new_source'\n" + if ($diagnostics); + rdb_ensure_file( $rule, $new_source ); } my @more_sources = &rdb_set_dependentsA( $rule ); @@ -3871,7 +3914,12 @@ sub rdb_set_dependentsA { # Call rdb_set_dependentsA( rules ...) # Returns array (sorted), of new source files. local @new_sources = (); + local @deletions = (); rdb_recurseA( [@_], 0, \&rdb_one_depA ); + foreach (@deletions) { + my ($rule, $file) = @$_; + rdb_remove_files( $rule, $file ); + } &rdb_make_links; return uniqs( @new_sources ); } #END rdb_set_dependentsA @@ -3885,6 +3933,7 @@ sub rdb_one_depA { my ($base_name, $path, $toext) = fileparseA( $new_dest ); $base_name = $path.$base_name; $toext =~ s/^\.//; + my $Pinput_extensions = $input_extensions{$rule}; DEP: foreach my $dep ( @cus_dep_list ) { my ($fromext,$proptoext,$must,$func_name) = split(' ',$dep); @@ -3902,6 +3951,7 @@ DEP: push @new_sources, $new_dest; } if (! rdb_rule_exists( $$Pfrom_rule ) ) { + print "=== Creating rule for '$$Pfrom_rule'\n"; rdb_create_rule( $$Pfrom_rule, 'cusdep', '', \@PAnew_cmd, 3, $source, $new_dest, $base_name, 0 ); } @@ -3931,7 +3981,11 @@ DEP: } } } - elsif ( ($toext eq '') && (! -e $file ) ) { + elsif ( ($toext eq '') + && (! -e $file ) + && (! -e "$base_name.$proptoext" ) + && exists $$Pinput_extensions{$proptoext} + ) { # Empty extension and non-existent destination # This normally results from \includegraphics{A} # without graphics extension for file, when file does @@ -3939,7 +3993,7 @@ DEP: my $source = "$base_name.$fromext"; if ( -e $source ) { $new_dest = "$base_name.$proptoext"; - my $from_rule = "cusdep $fromext $toext $base_name"; + my $from_rule = "cusdep $fromext $proptoext $base_name"; push @new_sources, $new_dest; print "Ensuring rule for '$from_rule', to make '$new_dest'\n" if $diagnostics > -1; @@ -3955,6 +4009,9 @@ DEP: ); } rdb_ensure_file( $rule, $new_dest, $from_rule ); + # We've now got a spurious file in our rule. But don't mess + # with deleting an item we are in the middle of! + push @deletions, [$rule, $file]; return; } } # End of Rule found @@ -4015,31 +4072,9 @@ sub rdb_accessible { } #END rdb_accessible #************************************************************ - -sub rdb_possible_primaries { - # Returns array of possible primaries - my @rules = (); - foreach my $rule ( keys %known_rules ) { - if ( $known_rules{$rule} eq 'primary') { - push @rules, $rule; - } - } - return @rules; -} #END rdb_possible_primaries - -#************************************************************ #************************************************************ #************************************************************ -# Routines for makes. NEW VERSIONS ?? - -#????????Debugging routines: -sub R1 {print "===START $rule\n"} -sub R2 {print "===END $rule\n"} -sub F1 {print " ---START $file\n"} -sub F2 {print " ---END $file\n"} -#************************************************************ - sub rdb_makeB { # Call: rdb_makeB( target, ... ) # Makes the targets and prerequisites. @@ -4192,6 +4227,7 @@ sub rdb_makeB { local @changed = (); local @disappeared = (); local @no_dest = (); # Non-existent destination files + local @rules_never_run = (); local @rules_to_apply = (); &rdb_classify_rules( \%possible_primaries, @requested_targets ); @@ -4254,7 +4290,10 @@ sub rdb_makeB { continue { # Re-evaluate rule classification and accessibility, # but do not change primaries. - &rdb_classify_rules( \%current_primaries, @requested_targets ); + # Problem is that %current_primaries gets altered + my %old_curr_prim = %current_primaries; + &rdb_classify_rules( \%possible_primaries, @requested_targets ); + %current_primaries = %old_curr_prim; &rdb_make_links; } } @@ -4296,11 +4335,14 @@ sub rdb_makeB1 { if ($diagnostics) { print " MakeB1 $rule\n"; } if ($failure & ! $force_mode) {return;} &rdb_clear_change_record; - &rdb_flag_changes_here; -# if ($diagnostics>-1) { print " MakeB1.1 $rule $$Pout_of_date\n"; } + if ( ($$Prun_time == 0) && exists($possible_primaries{$rule}) ) { + push @rules_never_run, $rule; + $$Pout_of_date = 1; + } + else { + &rdb_flag_changes_here; + } - my $return = 0; # Return code from called routine -#?? print "makeB1: Trying '$rule' for '$$Pdest': "; if (!$$Pout_of_date) { #?? if ( ($$Pcmd_type eq 'primary') && (! $silent) ) { # print "Rule '$rule' up to date\n"; @@ -4310,19 +4352,17 @@ sub rdb_makeB1 { if ($diagnostics) { print " remake\n"; } if (!$silent) { print "$My_name: applying rule '$rule'...\n"; - &rdb_diagnose_changes( "Rule $rule: "); + &rdb_diagnose_changes( "Rule '$rule': "); } -##????????????????????????????????????: variable rules_applied not used $rules_applied{$rule} = 1; $runs++; -#?? print "$rule: $$Pcmd_type\n"; # We are applying the rule, so its source file state for when it # was last made is as of now: # ??IS IT CORRECT TO DO NOTHING IN CURRENT VERSION? # The actual run - $return = 0; + my $return = 0; # Return code from called routine # Rule may have been created since last run: if ( ! defined $pass{$rule} ) {$pass{$rule} = 0; } if ( $pass{$rule} ge $max_repeat ) { @@ -4452,6 +4492,7 @@ sub rdb_classify_rules { foreach ( @one_time ) { print " $_\n"; } } } #end diagnostics + } #END rdb_classify_rules #------------------- @@ -4460,7 +4501,7 @@ sub rdb_classify1 { # Helper routine for rdb_classify_rules # Applied as rule_act1 in recursion over rules # Assumes rule context, and local variables from rdb_classify_rules -# print "=========== '$rule' $depth ========== \n"; + #print "??======= '$rule' $depth $state ========== \n"; push @classify_stack, [$state]; if ( exists $possible_one_time{$rule} ) { # Normally, we will have already extracted the one_time rules, @@ -4675,13 +4716,14 @@ sub rdb_primary_run { #************************************************************ sub rdb_clear_change_record { + # Initialize diagnostics for reasons for running rule. @changed = (); @disappeared = (); @no_dest = (); - @rules_to_apply = (); -#??????????????? $failure = 0; -##????????????????????????????????????: variable rules_applied not used - $rules_applied = 0; + @rules_never_run = (); + @rules_to_apply = (); # This is used in recursive application + # of rdb_flag_changes_here, to list + # rules that were out-of-date for some reason. } #END rdb_clear_change_record #************************************************************ @@ -4767,9 +4809,9 @@ sub rdb_file_change1 { #************************************************************ -sub rdb_count_changes { - return $#changed + $#no_dest + $#rules_to_apply + 3; -} #END rdb_count_changes +sub rdb_need_run { + return ($#changed >= 0) || ($#no_dest >= 0) || ($#rules_to_apply >= 0); +} #END rdb_need_run #************************************************************ @@ -4779,26 +4821,31 @@ sub rdb_diagnose_changes { # Precede the message by the optional heading, else by "$My_name: " my $heading = defined($_[0]) ? $_[0] : "$My_name: "; - if ( &rdb_count_changes == 0 ) { - warn "${heading}No changes\n"; - return; - } - warn "${heading}Changes:\n"; - if ( $#changed >= 0 ) { - warn " Changed files, or newly in use since previous run(s):\n"; - foreach (uniqs(@changed)) { warn " '$_'\n"; } + if ($#rules_never_run >= 0) { + warn "${heading}Rules & subrules not known to be previously run:\n"; + foreach (@rules_never_run) { warn " $_\n"; } } - if ( $#disappeared >= 0 ) { - warn " No-longer-existing files:\n"; - foreach (uniqs(@disappeared)) { warn " '$_'\n"; } + if ( ($#changed >= 0) || ($#disappeared >= 0) || ($#no_dest >= 0) ) { + warn "${heading}File changes, etc:\n"; + if ( $#changed >= 0 ) { + warn " Changed files, or newly in use since previous run(s):\n"; + foreach (uniqs(@changed)) { warn " '$_'\n"; } + } + if ( $#disappeared >= 0 ) { + warn " No-longer-existing files:\n"; + foreach (uniqs(@disappeared)) { warn " '$_'\n"; } + } + if ( $#no_dest >= 0 ) { + warn " Non-existent destination files:\n"; + foreach (uniqs(@no_dest)) { warn " '$_'\n"; } + } } - if ( $#no_dest >= 0 ) { - warn " Non-existent destination files:\n"; - foreach (uniqs(@no_dest)) { warn " '$_'\n"; } + elsif ($#rules_to_apply >=0) { + warn "${heading}The following rules & subrules became out-of-date:\n"; + foreach (@rules_to_apply) { warn " '$_'\n"; } } - if ( $#rules_to_apply >= 0 ) { - warn " Rules to apply:\n"; - foreach (uniqs(@rules_to_apply)) { warn " '$_'\n"; } + else { + warn "${heading}No file changes\n"; } } #END rdb_diagnose_changes @@ -4902,6 +4949,7 @@ sub rdb_recurseA { # This routine sets a context for anything recursive, with @heads, # %visited and $depth being set as local variables. + local @heads = (); my $rules = shift; @@ -5309,7 +5357,8 @@ sub show_array { # Then print rest of @_, one item per line preceeded by some space warn "$_[0]\n"; shift; - foreach (@_){ warn " $_\n";} + if ($#_ >= 0) { foreach (@_){ warn " '$_'\n";} } + else { warn " NONE\n"; } } #************************************************************ @@ -5759,6 +5808,47 @@ sub show_cus_dep { #################################################### +sub add_input_ext { + # Usage: add_input_ext( rule, ext, ... ) + # Add extension(s) (specified without a leading period) to the + # list of input extensions for the given rule. The rule should be + # 'latex' or 'pdflatex'. These extensions are used when an input + # file without an extension is found by (pdf)latex, as in + # \input{file} or \includegraphics{figure}. When latexmk searches + # custom dependencies to make the missing file, it will assume that + # the file has one of the specified extensions. + my $rule = shift; + if ( ! exists $input_extensions{$rule} ) { + $input_extensions{$rule} = {}; + } + my $Prule = $input_extensions{$rule}; + foreach (@_) { $$Prule{$_} = 1; } +} + +#################################################### + +sub remove_input_ext { + # Usage: remove_input_ext( rule, ext, ... ) + # Remove extension(s) (specified without a leading period) to the + # list of input extensions for the given rule. The rule should be + # 'latex' or 'pdflatex'. See sub add_input_ext for the use. + my $rule = shift; + if ( ! exists $input_extensions{$rule} ) { return; } + my $Prule = $input_extensions{$rule}; + foreach (@_) { delete $$Prule{$_}; } +} + +#################################################### + +sub show_input_ext { + # Usage: show_input_ext( rule ) + my $rule = shift; + show_array ("Input extensions for rule '$rule': ", + keys %{$input_extensions{$rule}} ); +} + +#################################################### + sub find_dirs1 { # Same as find_dirs, but argument is single string with directories # separated by $search_path_separator |