如何在 LaTeX 中根据编译计算机的主机名构建条件语句?例如:
\ifhostname{mymachine}
\dostuff
\else
\dootherstuff
\fi
原因:我正在与一位合作者合作编写一份文档,该文档依赖于位于不同位置的几个文件。我希望该文档能够自动检测谁在编写它并使用适当的文件位置。
答案1
您可以通过以下方式检测它,但这些可能需要特定于操作系统的代码。实现此目的的更简单的方法是通过并测试来\immediate\write18
测试文件是否存在。\IfFileExists
~/<user>/.login
下面的测试示例将导致方程式居中(假设您将其保存为扩展名为 .tex 的文件)。但是,如果您更改不存在的文件的测试,方程式将左对齐...
\documentclass{article}
\IfFileExists{\jobname.tex}{% Adjust file name here to ~/user/.login or some other known file
\usepackage{amsmath}
}{
\usepackage[fleqn]{amsmath}
}
\begin{document}
\begin{align*}
y &= x
\end{align*}
\end{document}
希望这可以帮助...
答案2
在 luatex 中,os.getenv('HOSTNAME')
至少在 *nix 系统上,您可以使用它来获取主机名。我不知道环境变量是否也在 Windows 上设置。因此,在 ConTeXt 中,您可以使用
\startluacode
if os.getenv('HOSTNAME') == "...." then
...
else
...
end
\stopluacode
或者在 LaTeX 中你可以使用
\usepackage{luacode}
....
\begin{luacode}
if os.getenv('HOSTNAME') == "...." then
...
else
...
end
\end{luacode}
答案3
至少在 Linux 上,主机名应该在 中/etc/hostname
,因此您可以尝试使用 Heiko Oberdiek 的catchfile
包输入该文件:
\documentclass{article}
\usepackage{catchfile}
\CatchFileDef{\hname}{/etc/hostname}{}
\def\myhname{myhostname }
\begin{document}
\hname \myhname
\ifx\hname\myhname Blah \else Bloh\fi
\end{document}
应该打印您的主机名并将\ifx
其与给定值进行比较。
答案4
我会尽量简单,将一个简短的文件放入本地 TEXMF 树或文档文件夹中,其中包含每个主机上的不同 if-switch 命令。然后可以使用\input
或轻松读取此文件\InputIfFileExists
。或者让输入文件本身包含所有必需的前导代码。
这需要一点努力,但在这种情况下似乎不是问题。无论如何,您都需要了解每个主机的具体需求。
例如,主机特定文件可以保存数字宏,例如:
% hostnumber.tex
\def\hostnumber{0}% for the first host, then 1, 2, 3
然后使用:
\def\hostnumber{-1}% fall-back default
\InputIfFileExists{hostnumber}
\ifcase\hostnumber
% first host
\or
% second host
\or
% third host
\or
% ...
\else
% host number out of range (<0 or >max)
% Insert fall-back code here
\fi