我的乳胶文件大致如下:
...
\usepackage{listings}
...
\lstinputlisting{F4_01fig2dev.ptx}
...
并且要创建文件F4_01fig2dev.ptx
。实际上我想用 构建latexmk
。通常的方法是,运行latexmk
latex 处理器来scrollmode
找出丢失的文件,使用附加规则创建丢失的文件,然后重新运行 latex 处理器。
\input{F4_01fig2dev.ptx}
如果我使用或使用\includegraphics
(使用 graphicx 包)或使用\import
(使用 import 包)嵌入文件,则通常的技术latexmk
可以使用。
它不适用于\lstinputlisting
。最初,我在这里说原因是出于某种原因\lstinputlisting
不尊重scrollmode
,但这不是区别。我不想再犯错误的怀疑,但我观察到 FLS 文件无论如何都不包含要包含的文件,所以没有区别。但日志文件有点不同:
! Package Listings Error: File `F4_01fig2dev(.ptx)' not found.
对于listings
包与
! LaTeX Error: File `F4_01fig2dev.ptx' not found.
对于其他类型的包含。也许latexmk
不能以这种方式识别结尾。我必须说,我发现listings
包装更精确。
好的,现在要么latexmk
进行更改,要么listings
进行包更改,或者我采取一些解决方法。
我想到了条件代码,如果文件不存在则绕过。还有其他想法吗?
正如 cabohah 所建议的,我将添加我的.latexmkrc
文件。我将发布完整的内容,
#!/usr/bin/env perl
# to create pdf via lualatex
#$pdflatex = 'lualatex -file-line-error %O %S';
# PDF-generating modes are:
# 1: pdflatex, as specified by $pdflatex variable (still largely in use)
# 2: postscript conversion, as specified by the $ps2pdf variable (useless)
# 3: dvi conversion, as specified by the $dvipdf variable (useless)
# 4: lualatex, as specified by the $lualatex variable (best)
# 5: xelatex, as specified by the $xelatex variable (second best)
$pdf_mode = 4;# specifies creation of pdf via lualatex
# If additional parameters must be passed to lualatex
#'svg' package.
# It converts raw SVG files to the PDF+PDF_TEX combo using InkScape.
# $lualatex = "lualatex --shell-escape";
# note that -recorder is implicitly added
$latex2pdfOptions = "-interaction=nonstopmode -synctex=1 -shell-escape";
$lualatex = "lualatex $latex2pdfOptions %O %S";
#$postscript_mode = $dvi_mode = 0;
# to configure bibtex
$bibtex_use=2;
# this cannot be done according to the according latex maven plugin,
# because the according parameter maxNumReRunsLatex may be set to -1
# which signifies an infinite number of runs.
$max_repeat=30;
# default are tex and eps, but could also be pdf and ptx and mps
# Currently, all those files are given with explicit endings,
# so no extensions to be added.
#add_input_ext('');
# It is what it seems to be: clean inludes what was generated by cus
$cleanup_includes_cusdep_generated = 1;
$cleanup_includes_generated = 1;
#$makeindex = 'makeindex %O -o %D %S'; # the default
# TBD: clarify: xdv and dvi seem to be internal.
# maybe missing other extensions in conjunction with synctex
$clean_ext .= " %R.synctex.gz";
# bbl does not work
#@generated_exts = (@generated_exts, 'lol', 'bbl', 'glo', 'ist')
#print "Hello!"
#foreach (@generated_exts) {
#print "Generated exts: $_\n";
#}
#print "clean_ext\n";
# Here @generated_exts is ('aux', 'fls', 'log', # generated by latex already
# 'toc', 'lof', 'lot', 'out', # generated by latex conditionally
# 'idx', 'ind', 'blg', 'ilg', # concerning indices
# # strange enough: nothing for bibtex
# 'xdv', 'bcf'
# extensions ext to be deleted by latexmk -c
# Note that the file names are %R.ext.
# this may cause problems with extensions containing a dot.
# Also this is not general enough
# if the generated file deviates from %R by more than an extension.
# In this case, use $clean_ext$
# Here, $clean_ext is empty.
# list of listings, whereas lof and lot are already present.
push @generated_exts, "lol";
push @generated_exts, "dvi", "xdv";
# for beamer class
push @generated_exts, "nav", "snm", "vrb";
# why are .ist and xdy not under generated_exts?
# note that currently, either %R or what is present is the extension only!
# this does not make sense very much.
# $clean_ext .= " stateMachine.log"; does not work, because stateMachine.log is the extension!
# should be under indexing
$clean_ext .= " %R.ist %R.xdy %R-*.ind %R-*.idx %R-*.ilg %R-*.ind";
add_cus_dep('fig', 'ptx', 0, 'fig2dev');
sub fig2dev {
$file = $_[0];
print("$file");
rdb_add_generated("$file.eps", "$file.pdf", "$file.ptx");
my $GenOptions = "";
my $PtxOptions = "";
my $PdfEpsOptions = "";
print("create from $file.fig");
rdb_add_generated("$file.ptx", "$file.pdf", "$file.eps");
#fig2dev -L pstex <fig2devGenOptions> <fig2devPdfEpsOptions> xxx.fig xxx.eps
#fig2dev -L pdftex <fig2devGenOptions> <fig2devPdfEpsOptions> xxx.fig xxx.pdf
#fig2dev -L pdftex_t <fig2devGenOptions> <fig2devPtxOptions> -p xxx xxx.fig xxx.ptx
my $ret1 = system("fig2dev -L pstex $GenOptions $PdfEpsOptions $file.fig $file.eps");
my $ret2 = system("fig2dev -L pdftex $GenOptions $PdfEpsOptions $file.fig $file.pdf");
my $ret3 = system("fig2dev -L pdftex_t $GenOptions $PtxOptions -p $file $file.fig $file.ptx");
return ($ret1 or $ret2 or $ret3);
}
add_cus_dep('gp', 'ptx', 0, 'gnuplot');
sub gnuplot {
$file = $_[0];
print("create from $file.gp");
rdb_add_generated("$file.ptx", "$file.pdf", "$file.eps");
my $nuplotOptions = "";
my $ret1 = system("gnuplot -e \"set terminal cairolatex pdf $gnuplotOptions;\
set output '$file.ptx';\
load '$file.gp'\"");
# my $ret2 = system("gnuplot -e \"set terminal cairolatex eps $gnuplotOptions;\
# set output '$file.ptx';\
# load '$file.gp'\"");
return $ret;
}
# metapost rule from http://tex.stackexchange.com/questions/37134
#add_cus_dep('mp', 'mps', 0, 'mpost');
add_cus_dep('mp', 'mps', 0, 'mpost');
sub mpost {
my $file = $_[0];
print("create from $file.mp");
rdb_add_generated("$file.mps", "$file.fls", "$file.log");
my ($name, $path) = fileparse($file);
pushd($path);
my $return = system("mpost -interaction=nonstopmode -recorder -s prologues=2 -s 'outputtemplate=\"%j.mps\"' $name");
popd();
return $return;
}
add_cus_dep('svg', 'ptx', 0, 'inkscape');
sub inkscape {
my $file = $_[0];
print("create from $file.svg");
rdb_add_generated("$file.ptx", "$file.pdf");
my $ret1 = system("inkscape -D --export-filename=$file.pdf --export-latex $file.svg ");
#my $ret2 = system("inkscape -D --export-filename=$file.eps --export-latex $file.svg ");
#use File::Copy;
# This works only for pdf, not for eps.
#unlink($file.pdf_tex) or die "cannot unlink $file.pdf_tex";
rename("$file.pdf_tex", "$file.ptx");# or die "cannot move $file.pdf_tex";
return $ret1;# or $ret2;
}
# graphics for xfig (not appropriate for mixed tex/pdf)
# add_cus_dep('fig', 'pdf', 0, 'fig2pdf');
# sub fig2pdf {
# system( "fig2dev -Lpdf \"$_[0].fig\" \"$_[0].pdf\"" );
# }
# use splitindex
$makeindex = 'internal splitindex';
sub splitindex {
# Use splitindex instead of makeindex.
# The splitindex programe starts from an .idx file, makes a set of
# other .idx files for separate indexes, and then runs makeindex to
# make corresponding .ind files.
# However, it is possible that the document uses the splitindex
# package, but in a way compatible with the standard methods
# compatible with makeindex, i.e., with a single index and with the
# use of the \printindex command.
# Then we need to invoke makeindex.
# In addition, latexmk assumes that makeindex or its replacement makes
# an .ind file from an .idx file, and latexmk gives an error if it
# doesn't exist, we need to make an .ind file.
# Both problems are solved by running makeindex and then splitindex.
# Note: errors are returned by makeindex and splitindex for things
# like a missing input file. No error is returned for lines in an
# input file that are in an incorrect format; they are simply
# ignored. So no problem is caused by lines in the .idx file
# that are generated by splitindex in a format incompatible with
# makeindex.
my $ret1 = system( "makeindex", $$Psource );
my $ret2 = system( "splitindex", $$Psource );
return $ret1 || $ret2;
}
add_cus_dep( 'acn', 'acr', 0, 'makeglossaries' );
add_cus_dep( 'glo', 'gls', 0, 'makeglossaries' );
push @generated_exts, 'glo', 'gls', 'glg';
push @generated_exts, 'acn', 'acr', 'alg';
push @generated_exts, "ist"; # index stylefile created by the glossaries package
#$clean_ext .= " acr acn alg glo gls glg";# TBD: clarify: better in @generated_exts?
sub makeglossaries {
my ($base_name, $path) = fileparse( $_[0] );
my @args = ( "-q", "-d", $path, $base_name );
if ($silent) { unshift @args, "-q"; }
return system "makeglossaries", "-d", $path, $base_name;
}
sub run_makeglossaries {
my ($base_name, $path) = fileparse( $_[0] ); #handle -outdir param by splitting path and file, ...
pushd $path; # ... cd-ing into folder first, then running makeglossaries ...
if ( $silent ) {
# system "makeglossaries -q '$base_name'"; #unix
system "makeglossaries", "-q", "$base_name"; #windows
}
else {
# system "makeglossaries '$base_name'"; #unix
system "makeglossaries", "$base_name"; #windows
};
popd; # ... and cd-ing back again
}
# !!! ONLY WORKS WITH VERSION 4.54 or higher of latexmk
#TBD: take into account: modified:
# '$_[0]'->
# #############
# # makeindex #
# #############
# @ist = glob("*.ist");
# if (scalar(@ist) > 0) {
# $makeindex = "makeindex -s $ist[0] %O -o %D %S";
# }
# glossaries new with bib2gls
# push @generated_exts, 'glstex', 'glg';
# add_cus_dep('aux', 'glstex', 0, 'run_bib2gls');
# sub run_bib2gls {
# if ( $silent ) {
# my $ret = system "bib2gls --silent --group $_[0]";
# } else {
# my $ret = system "bib2gls --group $_[0]";
# };
# my ($base, $path) = fileparse( $_[0] );
# if ($path && -e "$base.glstex") {
# rename "$base.glstex", "$path$base.glstex";
# }
# # Analyze log file.
# local *LOG;
# $LOG = "$_[0].glg";
# if (!$ret && -e $LOG) {
# open LOG, "<$LOG";
# while (<LOG>) {
# if (/^Reading (.*\.bib)\s$/) {
# rdb_ensure_file( $rule, $1 );
# }
# }
# close LOG;
# }
# return $ret;
# }
$pythontex = 'pythontexW %R';#'pythontexW %O %R';
push @generated_exts, "pytxcode", "plg";
push @generated_exts, "depytx", "dplg";
$clean_ext .= " pythontex-files-%R/* pythontex-files-%R";
#$extra_rule_spec{'pythontex'} = [ 'internal', '', 'mypythontex', "%Y%R.pytxcode", "%Ypythontex-files-%R/%R.pytxmcr", "%R", 1 ];
$extra_rule_spec{'pythontex'} = [ 'internal', '', 'mypythontex', "%R.pytxcode", "pythontex-files-%R/%R.pytxmcr", "%R", 1 ];
sub mypythontex {
my $result_dir = $aux_dir1."pythontex-files-$$Pbase";
my $ret = Run_subst( $pythontex, 2 );
rdb_add_generated( glob "$result_dir/*" );
#my $fh = new FileHandle $$Pdest, "r";
open( my $fh, "<", $$Pdest );
if ($fh) {
print "path: $ENV{PATH}";
while (<$fh>) {
if ( /^%PythonTeX dependency:\s+'([^']+)';/ ) {
print "Found pythontex dependency '$1'\n";
rdb_ensure_file( $rule, $aux_dir1.$1 );
}
}
undef $fh;
}
else {
warn "mypythontex: I could not read '$$Pdest'\n",
" to check dependencies\n";
}
return $ret;
}
# for htlatex
push @generated_exts, "4tc", "4ct", "tmp", "xref", "css", "idv", "lg";
# TBD: for -C remove also html and xhtml
# TBD: check that this plugin also removes all these extensions.. think of lg.
# biblatex
# push @generated_exts, "run.xml";# does run.xml work?
# $clean_ext .= " %R-blx.bib";
答案1
您可以使用中的命令functional
来判断文件是否存在。
\documentclass{article}
\usepackage{functional}
\usepackage{listings}
\NewDocumentCommand{\LstIfExistInputListing}{m}{\fileIfExistT{#1}{\lstinputlisting{#1}}}
\begin{document}
\fileIfExistT{F4_01fig2dev.ptx}{\lstinputlisting{F4_01fig2dev.ptx}}
or
\LstIfExistInputListing{F4_01fig2dev.ptx}
\end{document}
答案2
如果您只需要将F4_01fig2dev(.ptx)
错误消息更改为F4_01fig2dev.ptx
,您可以使用以下方法执行此操作:
\documentclass{article}
\usepackage{listings}
\usepackage{xpatch}
\makeatletter
\newcommand*{\NewLine}{^^J}%
\xpatchcmd{\lst@MissingFileError}
{`#1(.#2)' not found.}
{`#1.#2' not found.\NewLine}
{%
\typeout{File ending patch for \string\lst@MissingFileError\space done.}%
}{%
\typeout{File ending patch for \string\lst@MissingFileError\space failed.}%
}
\makeatother
\begin{document}
Test
\lstinputlisting{F4_01fig2dev.ptx}
\end{document}
这会导致错误消息:
! Package Listings Error: File `F4_01fig2dev.ptx' not found. Type X to quit or <RETURN> to proceed,or enter new name. (Default extension: ptx)
如果需要,您还可以将“Package Listings”替换为“LaTeX”:
\documentclass{article}
\usepackage{listings}
\usepackage{xpatch}
\makeatletter
\newcommand*{\NewLine}{^^J}%
\xpatchcmd{\lst@MissingFileError}
{Package Listings Error: File `#1(.#2)' not found.}
{LaTeX Error: File `#1.#2' not found.\NewLine}{%
\typeout{File ending patch for \string\lst@MissingFileError\space done.}%
}{%
\typeout{File ending patch for \string\lst@MissingFileError\space failed.}%
}
\makeatother
\begin{document}
Test
\lstinputlisting{F4_01fig2dev.ptx}
\end{document}
其结果是:
! LaTeX Error: File `F4_01fig2dev.ptx' not found. Type X to quit or <RETURN> to proceed,or enter new name. (Default extension: ptx)
在这两种情况下,默认扩展名仍会显示在错误消息中。但由于补丁,前面的空格标记or
丢失了。如果这很重要,您必须替换整个消息,而不仅仅是第一行。
免责声明:我不知道如何latexmk
触发其中一条消息,因为latexmk
您的问题中缺少配置的相应部分,所以我无法测试它。
答案3
答案与 Clara 的建议非常接近。代码行是
\fileIfExistTF{F4_01fig2dev.ptx}{\lstinputlisting{F4_01fig2dev.ptx}}{\input{F4_01fig2dev.ptx}}
在第一次lualatex
运行中F4_01fig2dev.ptx
不存在,但latexmk
通过检测丢失的文件\input{F4_01fig2dev.ptx}
并根据相应规则创建它。在随后的所有运行中,F4_01fig2dev.ptx
都会\lstinputlisting{F4_01fig2dev.ptx}
使用。
这实际上并不令人满意,因为当然,从到的变化\input{F4_01fig2dev.ptx}
会将\lstinputlisting{F4_01fig2dev.ptx}
分解变为页面,从而导致额外的lualatex
运行。
它还会稍微污染代码(在我的例子中,lstinputlisting 带有很多参数。)
所以我可能更喜欢一个更好的解决方案。