tex 知道它自己的命令行参数吗?

tex 知道它自己的命令行参数吗?

是否可以在文档中测试传递给 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 testtest.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总是会忽略参数:

luatex 文档

相关内容