![tex 知道它自己的命令行参数吗?](https://linux22.com/image/248570/tex%20%E7%9F%A5%E9%81%93%E5%AE%83%E8%87%AA%E5%B7%B1%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0%E5%90%97%EF%BC%9F.png)
是否可以在文档中测试传递给 tex 的命令行参数?引发这个问题的特定情况是xelatex 和 pdflatex 输出文件中的标签不同-8bit
其中,了解参数是否已传递给 tex 并发出警告会很有用。也就是说,如果pgfplots
可能包含代码:
\ifxetex
\ifarg{8bit}
\else
\pkgwarning{You're using xe(la)tex without the -8bit argument. Some external files might go wrong. If things don't work as you expect, try using the -8bit argument.}
\fi
\fi
那么它可能使我们更容易地发现所链接问题的情况何时发生。
(问了上述问题一年后,这个问题再次发生在我身上,我花了一些时间才意识到问题所在并找到解决方案,尽管上次发现这个问题的人是我自己!)
答案1
恐怕答案是“不是直接的”。
我们可以定义这样的测试:
\input catchfile.sty
\newif\ifeightbit
\begingroup
\immediate\openout15=tab.tst
\catcode`\^^I=12
\immediate\write15{^^I}
\immediate\closeout15
\CatchFileDef\atab{tab.tst}{\catcode`\^=12 \catcode`I=12 }
\edef\btab{\string^\string^\string I }
\ifx\atab\btab
\global\eightbitfalse
\else
\global\eightbittrue
\fi
\endgroup
\show\ifeightbit
使用xetex test
(test.tex
是文件名)我们将得到,\iffalse
而使用xetex -8bit test
我们将得到\iftrue
。
如果不写入文件,似乎无法做到这一点,因为\scantokens
避免了通过表格进行“翻译” xchr
。因此,虽然我们可以在读回文件时捕获三个不同的字符,但如果没有写入选项-8bit
,我们就无法使用 来做到这一点\scantokens
。
答案2
和--shell-escape
:
(由于某些权限问题,这在 Overleaf 上不起作用,但除此之外应该可以在大多数 POSIX 系统上运行)
\ExplSyntaxOn \sys_get_shell:nnN {ps~-o~args=~-p~$(ps~-o~ppid=~-p~$$)} {\cctab_select:N \c_other_cctab} \l_data_tl \ExplSyntaxOff
引用我的另一个回答https://tex.stackexchange.com/a/621510/250119。
然后你需要以某种方式解析参数——但要注意,正确解析参数非常困难。一种简单的方法是
\str_if_in:VnTF \l_data_tl {-8} {
\typeout{>> probably~8bit}
} {
\typeout{>> not~8bit}
}
但它并非万无一失,我运行这个简单的 bash 文件:
g(){
echo "========" "$@"
"$@" </dev/null | grep '>>\|!'
}
f(){
g pdflatex --shell-escape "$@"
g xelatex --shell-escape "$@"
}
mkdir -p -- --8bit a "a a" # create auxiliary directories named literally "--8bit" and "a" and "a a"
ln -rsf a.tex "a --8bit b.tex" # link "a.tex" -> a file literally named "a --8bit b.tex"
ln -rsf a.tex "b.tex"
# ======== these 3 cases return false:
f a.tex
f --output-di a "a --8bit b.tex"
f --output-di --8bit a.tex
# ======== these 7 cases return true:
f --output-di "a a" --8bit b.tex
f -8bit a.tex
f -8b a.tex
f --8bit a.tex
f --8bi a.tex
f --8b a.tex
f --8 a.tex
f -8 a.tex
包含a.tex
:
% ======== copy from egreg's test ========
\input catchfile.sty
\newif\ifeightbit
\begingroup
\immediate\openout15=tab.tst
\catcode`\^^?=12
\immediate\write15{^^?}
\immediate\closeout15
\CatchFileDef\atab{tab.tst}{\catcode`\^=12 \catcode`?=12 }
\edef\btab{\string^\string^\string ? }
\ifx\atab\btab
\global\eightbitfalse
\else
\global\eightbittrue
\fi
\endgroup
\ExplSyntaxOn
\cs_generate_variant:Nn \str_if_in:nnTF {V}
\sys_get_shell:nnN {ps~-o~args=~-p~$(ps~-o~ppid=~-p~$$)} {\cctab_select:N \c_other_cctab} \l_data_tl
\typeout{>> \l_data_tl}
\str_if_in:VnTF \l_data_tl {-8} {
\typeout{>> probably~8bit}
} {
\typeout{>> not~8bit}
}
\typeout{>> ifeightbit=\meaning\ifeightbit}
\ExplSyntaxOff
\stop
如您所见,即使第一个块不是 8 位,简单测试也会对第一个块的最后 2 种情况输出“可能是 8 位”。
特别是,第二种和第四种情况使得输出完全相同的使用提供的命令行参数(您可以通过不使用来解决这个问题ps -o args
,但我不确定如何......)
LuaLaTeX 有表格arg
,但看起来你仍然需要手动解析它:
\directlua{for _, v in ipairs(arg) do print(v) end}
\stop
来自另一个问题在Luatex中,如何知道有效的输出目录?。
但是...在这种特定情况下,LuaTeX--8bit
总是会忽略参数: