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) следующий:

MVE для ifdefstring с lstinline внутри

Но чтобы сделать его пригодным для анализа, мне пришлось вручную добавлять лишнее \в \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

введите описание изображения здесь

Связанный контент