如何根据主机名进行检测和条件

如何根据主机名进行检测和条件

如何在 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

相关内容