
Estou usando \ifdefstring
como 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 \lstinline
barras invertidas, preciso escapá-las, caso contrário não funcionará.
Eu gostaria de poder adicionar \ifdefstring
blocos 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
) é:
Mas para torná-lo analisável, tive que adicionar manualmente o extra \
dentro das \lstinline
peças dentro dos \ifdefstring
blocos, 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}