Latexmk 使用 -jobname 和命令行 \def

Latexmk 使用 -jobname 和命令行 \def

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

相关内容