
Lo estoy usando \ifdefstring
como 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 \lstinline
barras invertidas que contienen, necesito escapar de ellas; de lo contrario, no funcionará.
Me gustaría poder agregar \ifdefstring
bloques 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:
Pero para hacerlo analizable, tuve que agregar manualmente el extra \
dentro de las \lstinline
partes dentro de los \ifdefstring
bloques, lo cual me gustaría evitar.
Respuesta1
\lstinline
es 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}