ifdefstring + lstinline = es necesario escapar de los caracteres

ifdefstring + lstinline = es necesario escapar de los caracteres

Lo estoy usando \ifdefstringcomo parte de una definición condicional que depende de una variable de entorno, como se indicaen esta pregunta.

Funciona prácticamente bien, excepto que dentro de los bloques definidos por \ifdefstring, si tengo \lstinlinebarras invertidas que contienen, necesito escapar de ellas; de lo contrario, no funcionará.

Me gustaría poder agregar \ifdefstringbloques sin tener que escapar/eliminar el escape de lo que hay dentro, especialmente porque el mensaje de error no es muy claro: la falta de barras invertidas genera mensajes de error crípticos al final del bloque. ¿Hay una manera de hacerlo?

Aquí hay un MVE, donde en cada caso (tanto dentro como fuera de \ifdefstring) se debe imprimir una única barra invertida.

\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}

La salida (aquí, con VAR != yes) es:

MVE para ifdefstring con lstinline dentro

Pero para hacerlo analizable, tuve que agregar manualmente el extra \dentro de las \lstinlinepartes dentro de los \ifdefstringbloques, lo cual me gustaría evitar.

Respuesta1

\lstinlinees un poco diferente de otros comandos textuales, por lo quepodervaya en el argumento a otro comando, pero con limitaciones.

Puede definir una forma \else- de para poder utilizar la versión sin escape.\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}

Salida con VARdesarmado

ingrese la descripción de la imagen aquí

Salida con VARestablecido enyes

ingrese la descripción de la imagen aquí

información relacionada