从 LaTeX 访问可能未定义的系统环境变量(后续问题)

从 LaTeX 访问可能未定义的系统环境变量(后续问题)

这个问题是此主题其中@egreg 提供了一个命令\getenv来访问系统环境变量。在回复我的评论时,他建议扩展他的脚本,以便处理环境变量未定义的可能性。我相信我已经在下面的脚本中遵循了他的建议,并期望\getenv电子邮件正文中的命令返回 UNDEFINED,但它返回的是空的。你能解释一下如何让它这样做吗?谢谢!

\documentclass{article}
    \usepackage{catchfile}
    \newcommand{\getenv}[2][]{%
      \CatchFileEdef{\temp}{"|kpsewhich --var-value #2"}{}%
      \ifx\temp\empty\def\temp{UNDEFINED}\fi
      \if\relax\detokenize{#1}\relax\temp\else\let#1\temp\fi}
    \begin{document}
        test \getenv{NOT_DEFINED}
    \end{document}

答案1

\ifx\temp\empty\def\temp{UNDEFINED}\fi在链接的答案中添加了错误的代码。

评论是“在行前添加\if\relax...”,因此这是指最新版本:

\documentclass{article}

\usepackage{ifxetex,ifluatex}

\ifxetex
  \usepackage{catchfile}
  \newcommand\getenv[2][]{%
    \immediate\write18{kpsewhich --var-value #2 > \jobname.tmp}%
    \CatchFileDef{\temp}{\jobname.tmp}{\endlinechar=-1}%
    \ifx\temp\empty\def\temp{UNDEFINED}\fi
    \if\relax\detokenize{#1}\relax\temp\else\let#1\temp\fi}
\else
  \ifluatex
    \newcommand\getenv[2][]{%
      \edef\temp{\directlua{tex.sprint(
        kpse.var_value("\luatexluaescapestring{#2}") or "" ) }}%
      \ifx\temp\empty\def\temp{UNDEFINED}\fi
      \if\relax\detokenize{#1}\relax\temp\else\let#1\temp\fi}
  \else
    \usepackage{catchfile}
    \newcommand{\getenv}[2][]{%
      \CatchFileEdef{\temp}{"|kpsewhich --var-value #2"}{\endlinechar=-1}%
      \ifx\temp\empty\def\temp{UNDEFINED}\fi
      \if\relax\detokenize{#1}\relax\temp\else\let#1\temp\fi}
  \fi
\fi

\begin{document}

\getenv{SHELL}

\getenv{NOT_DEFINED}

\end{document}

在此处输入图片描述

请注意删除不需要的行尾字符的\endlinechar=-1部分。您可能需要使用\CatchFileDef

\immediate\write18{rm -f \jobname.tmp;kpsewhich --var-value #2 > \jobname.tmp} 

使用 XeTeX,取决于您的 shell 设置。

答案2

如果你添加,\typeout{\temp}你会看到\temp等于\par,所以\empty你需要测试而不是测试\par。简单的方法\ifx\temp\par不起作用,但多亏了为什么我不能用 \par 比较字符串?,以下操作:

\documentclass{article}
\usepackage{catchfile}
\def\apar{\par}
\newcommand{\getenv}[2][]{%
  \CatchFileEdef{\temp}{"|kpsewhich --var-value #2"}{}%
  \ifx\temp\apar\def\temp{UNDEFINED}\fi
  \if\relax\detokenize{#1}\relax\temp\else\let#1\temp\fi}
\begin{document}
    test \getenv{NOT_DEFINED}
\end{document}

相关内容