这个问题是此主题其中@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}