我将其用作\ifdefstring
依赖于环境变量的条件定义的一部分,如下所述在这个问题中。
它基本上工作正常,除了在定义的块内\ifdefstring
,如果我有一个\lstinline
包含反斜杠,我需要转义它们,否则它将不起作用。
我希望能够添加\ifdefstring
块而不必转义/取消转义其中的内容,尤其是因为错误消息不太清楚:缺少反斜杠会导致块末尾出现神秘的错误消息。有办法吗?
这是一个 MVE,其中在每种情况下(包括内部和外部\ifdefstring
)都必须打印一个反斜杠。
\documentclass{article}
\usepackage{listings}
\usepackage{etoolbox}
% catchfile block copied from other question
\usepackage{catchfile}
\newcommand{\getenv}[2][]{%
\CatchFileEdef{\temp}{"|kpsewhich --var-value #2"}{\endlinechar=-1\relax}%
\if\relax\detokenize{#1}\relax\temp\else\edef#1{\temp}\fi}
\getenv[\VAR]{VAR}%
\begin{document}
\ifdefstring{\VAR}{yes}{
\lstinline|\\must_be_escaped_yes|
}{
\lstinline|\\must_be_escaped_not_yes|
}
\lstinline|\must_not_be_escaped|
\end{document}
输出(此处带有VAR != yes
)为:
但为了使其可解析,我必须手动\
在块\lstinline
内部的部分添加额外的内容\ifdefstring
,而这是我想避免的。
答案1
\lstinline
与其他逐字命令略有不同,因此能进入另一个命令的参数,但有限制。
您可以定义一个\else
–\fi
形式,\ifdefstring
以便使用未转义的版本。
\documentclass{article}
\usepackage{listings}
\usepackage{etoolbox}
% catchfile block copied from other question
\usepackage{catchfile}
\newcommand{\getenv}[2][]{%
\CatchFileEdef{\temp}{"|kpsewhich --var-value #2"}{\endlinechar=-1\relax}%
\if\relax\detokenize{#1}\relax\temp\else\edef#1{\temp}\fi}
\newcommand{\defstring}[2]{%
TT\fi
\ifdefstring{#1}{#2}{\iftrue}{\iffalse}%
\ignorespaces
}
\getenv[\VAR]{VAR}
\begin{document}
\if\defstring{\VAR}{yes}
\lstinline|\must_be_escaped_yes|
\else
\lstinline|\must_be_escaped_not_yes|
\fi
\lstinline|\must_not_be_escaped|
\end{document}