ifdefstring + lstinline = precisa escapar de caracteres

ifdefstring + lstinline = precisa escapar de caracteres

Estou usando \ifdefstringcomo parte de uma definição condicional que depende de uma variável de ambiente, conforme indicadonesta questão.

Funciona normalmente bem, exceto que dentro dos blocos definidos por \ifdefstring, se eu tiver \lstinlinebarras invertidas, preciso escapá-las, caso contrário não funcionará.

Eu gostaria de poder adicionar \ifdefstringblocos sem precisar escapar/retirar o escape do que está dentro, especialmente porque a mensagem de erro não é muito clara: barras invertidas ausentes levam a mensagens de erro enigmáticas no final do bloco. Tem algum jeito de fazer isso?

Aqui está um MVE, onde em cada caso (dentro e fora do \ifdefstring) uma única barra invertida deve ser impressa.

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

A saída (aqui, com VAR != yes) é:

MVE para ifdefstring com lstinline dentro

Mas para torná-lo analisável, tive que adicionar manualmente o extra \dentro das \lstinlinepeças dentro dos \ifdefstringblocos, o que gostaria de evitar.

Responder1

\lstinlineé um pouco diferente de outros comandos literais, entãopodevá no argumento para outro comando, mas com limitações.

Você pode definir uma forma \else– para poder usar a versão sem 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}

Saída com VARnão definido

insira a descrição da imagem aqui

Saída com VARdefinido parayes

insira a descrição da imagem aqui

informação relacionada