ifdefstring + lstinline = 需要转义字符

ifdefstring + lstinline = 需要转义字符

我将其用作\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 的 MVE

但为了使其可解析,我必须手动\在块\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}

VAR未设置的输出

在此处输入图片描述

输出VAR设置为yes

在此处输入图片描述

相关内容