pdflatex
我在转换此命令以使用时遇到问题latexmk
:
pdflatex --file-line-error --shell-escape --synctex=1 \
-jobname=foobar "\def\MyCustomDef{} \input{file-name.tex}"
我尝试将其用于latexmk
:
latexmk -pdf -silent \
-pdflatex=/usr/texbin/pdflatex --file-line-error --shell-escape --synctex=1 \
-jobname=foobar "\def\MyCustomDef{} \input{file-name.tex}"
但这导致
Latexmk: Could not find file [\def\MyCustomDef{} \input{file-name.tex}]. -- Use the -f option to force complete processing.
删除上述结果中的双引号将导致:
Latexmk: Need to specify at most one filename if jobname specified, but 2 were found (after defaults and wildcarding).
我之前的尝试是:
latexmk -pdf -silent \
-pdflatex=/usr/texbin/pdflatex --file-line-error --shell-escape --synctex=1 "\def\MyCustomDef{}" \
-jobname=foobar file-name.tex
但在弄清楚了语法之后pdflatex
,我假设一个必须用于\input{}
在命令行上定义宏时指定文件名。
更新:
我能够在命令行上让 mph 解决方案工作,但当我尝试将其放入我的脚本中时,我遇到了更多问题。我怀疑这是因为需要将事情转义到 David Carlisle 提到的正确时刻。嗯...这听起来有点像 TeX 的扩展相关问题——难怪我遇到了麻烦。:-)
这是我的 shell 脚本:
#!/bin/csh
set LATEX_MAKE = latexmk
set PDFLATEX = pdflatex
set LATEX_MAKE_OPTIONS = "-f -silent "
set PDFLATEX_OPTIONS = "-pdf -pdflatex=$PDFLATEX --file-line-error --shell-escape --synctex=1 "
set PDFLATEX_OPTIONS_WITH_DEF = "$PDFLATEX_OPTIONS %O '\def\MyCustomDef{}\input{%S}'"
set TEX_FILE = "mf2"
echo "----- Normal build:"
$LATEX_MAKE $LATEX_MAKE_OPTIONS $PDFLATEX_OPTIONS $TEX_FILE.tex
echo "----- Custom build (with jobname & def):"
$LATEX_MAKE -jobname=$TEX_FILE-def '$LATEX_MAKE_OPTIONS $PDFLATEX_OPTIONS_WITH_DEF' $TEX_FILE.tex
exit(0)
和测试文件:
\documentclass{article}
\begin{document}
hello
\ifdefined\MyCustomDef
My CustomDef was used.
\else
My CustomDef was not used.
\fi
\end{document}
答案1
传递适当的 Latexmk 规则作为选项的参数-pdflatex
。因此:
latexmk -pdf -silent \
-jobname=foobar \
-pdflatex="/usr/texbin/pdflatex --file-line-error --shell-escape --synctex=1 %O '\def\MyCustomDef{}\input{%S}'" file-name.tex
或者,您也可以不使用该选项,而是在其中一个 Latexmk 初始化文件 (例如或) 中-pdflatex
设置该变量。$pdflatex
./latexmkrc
./.latexmkrc
更新:
与 OP 使用的类似可用的 Csh 脚本:
#!/bin/csh
set LATEX_MAKE = latexmk
set PDFLATEX = pdflatex
set LATEX_MAKE_OPTIONS = '-f -silent '
set PDFLATEX_OPTIONS = '-pdf -pdflatex="'"$PDFLATEX --file-line-error --shell-escape --synctex=1 %O %S"'"'
set PDFLATEX_OPTIONS_WITH_DEF = '-pdf -pdflatex="'"$PDFLATEX --file-line-error --shell-escape --synctex=1 %O '\def\MyCustomDef {} \input { %S }'"'"'
set TEX_FILE = 'mf2'
echo '----- Normal build:'
eval $LATEX_MAKE $LATEX_MAKE_OPTIONS $PDFLATEX_OPTIONS $TEX_FILE.tex
echo '----- Custom build (with jobname & def):'
eval $LATEX_MAKE -jobname=$TEX_FILE-def $LATEX_MAKE_OPTIONS $PDFLATEX_OPTIONS_WITH_DEF $TEX_FILE.tex
exit(0)
Csh 对嵌套引号的支持相当有限。此外,很难转义括号 - 您必须用空格将其括起来。
答案2
给定此文件
\show\mydef
\documentclass{article}
\begin{document}
hello
\end{document}
以下内容适用于我在 cygwin 中使用 bash shell 作为命令行的情况。请注意,命令行在不同的 shell 和操作系统中的解释方式不同,因此基本上从最简单的开始,然后添加,{
直到它不再抱怨。\
\\
latexmk -f -jobname=mf2 "\\\\def\\\\mydef\{a\}\\\\input\{mf2\}"
生产
Latexmk: All targets (mf2.dvi) are up-to-date
但如果我删除 mf2.dvi 并再次执行此操作,我会得到
> \mydef=macro:
->a.
l.1 \show\mydef
这表明它起作用了。
命令行首先由 shell 解析,然后由 latexmk 解析,最后由 pdftex 本身解析,您必须制作\
并{
遍历它们。此外,您还需要-f
选择latexmk
强制它执行某些操作,这样就不用太担心了。
使用 tcsh 时,你需要不同的引用顺序
$ latexmk -f -jobname=mf2 "\\def\\mydef\{a\}\\input\{mf2\}"
要查看特定 shell 中需要的内容,最简单的方法是让 latexmk 执行 ot 所做的任何操作,然后查看 TeX 日志文件以查看 TeX 实际看到的命令行
如果日志显示
restricted \write18 enabled.
%&-line parsing enabled.
**\def\mydefa\inputmf2
你需要更多\
来保存{
答案3
您可以通过创建包含代码的-jobname
文件来避免 shell 反斜杠引用地狱和指定的需要foobar.tex
\def\MyCustomDef{}
\input{file-name.tex}
然后运行latexmk foobar.tex
。