在 LaTeX (e-TeX) 中将两个宏作为字符串进行比较

在 LaTeX (e-TeX) 中将两个宏作为字符串进行比较

如何比较两个距离字符串只有一个扩展的宏?

\def\A{ICT}
\newgetenv[\ICT]{\A}
% `\newgetenv` from https://tex.stackexchange.com/a/184924

现在我想检查\ICT评估结果是否就是\A评估结果;即:"ICT"

尝试(每次一行;其他人评论):

\ifdefequal{\expandafter\ICT}{\expandafter\A}{\def\ICT{FOO}}{\def\ICT{BAR}}
\ifdefequal{\ICT}{\expandafter\A}{\def\ICT{FOO}}{\def\ICT{BAR}}
\ifdefequal{\expandafter\ICT}{\A}{\def\ICT{FOO}}{\def\ICT{BAR}}

我也尝试了同样的 3 种可能性,包括\ifcsequal\ifdefstring。还尝试放弃\A和 ,只使用:ICT逐字逐句。

但是无论我将系统环境变量设置为何值,它们都定义了一个\ICT值为的。BAR$ICT

答案1

制作可用的测试文件...

\documentclass{book}%
\usepackage{etoolbox}%
\usepackage{xstring}%
\usepackage{catchfile}%

\newcommand{\getenv}[2][]{%
  \CatchFileEdef{\temp}{"|kpsewhich --var-value #2"}{}%
  \if\relax\detokenize{#1}\relax\temp\else\let#1\temp\fi}
%\getenv[\INCLUDE]{\string INCLUDE}

\def\newtemp{}%
\newcommand{\newgetenv}[2][]{%
  \CatchFileEdef{\temp}{"|kpsewhich --var-value #2"}{}%
  \StrGobbleRight{\temp}{1}[\newtemp]%  Delete the trailing whitespace character
  \if\relax\detokenize{#1}\relax\temp\else\edef#1{\newtemp}\fi%
}%

\begin{document}

\def\A{ICT}
\newgetenv[\ICT]{\A}

\ifx\ICT\A
\def\ICT{BAR}
\else
\def\ICT{FOO}
\fi

\show\ICT

\end{document}

默认定义\ICTFOO

 pdflatex pp024

生产

> \ICT=macro:
->FOO.
l.32 \show\ICT

但是如果环境变量 ICT 的值为 ICT(虽然您没有说,但它似乎是您尝试实施的测试),那么\ICT定义为BAR

 ICT=ICT pdflatex pp024

生产

> \ICT=macro:
->BAR.

一个更简单的定义是

\documentclass{book}

\begin{document}

\def\A{ICT}

\ifx\ICT\A
\def\ICT{BAR}
\else
\def\ICT{FOO}
\fi

\show\ICT

\end{document}

在哪里

pdflatex \\def\\ICT{$ICT}\\input pp024

生产

> \ICT=macro:
->FOO.

除非你得到 ICT=ICT

 ICT='ICT' ;pdflatex \\def\\ICT{$ICT}\\input pp024

产生

> \ICT=macro:
->BAR.

相关内容