ifdefstring + lstinline = Zeichen müssen maskiert werden

ifdefstring + lstinline = Zeichen müssen maskiert werden

Ich verwende \ifdefstringals Teil einer bedingten Definition, die von einer Umgebungsvariablen abhängt, wie angegebenin dieser Frage.

Es funktioniert größtenteils einwandfrei, außer dass ich innerhalb der durch definierten Blöcke \ifdefstring, falls ich ein \lstinlineenthaltenes Backslash habe, diese maskieren muss, da es sonst nicht funktioniert.

Ich möchte Blöcke hinzufügen können, \ifdefstringohne den Inhalt escapen/remaskieren zu müssen, insbesondere weil die Fehlermeldung nicht sehr eindeutig ist: Fehlende Backslashs führen zu kryptischen Fehlermeldungen am Ende des Blocks. Gibt es eine Möglichkeit, dies zu tun?

Hier ist ein MVE, bei dem jeweils (sowohl innerhalb als auch außerhalb des \ifdefstring) ein einzelner Backslash gedruckt werden muss.

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

Die Ausgabe (hier mit VAR != yes) ist:

MVE für ifdefstring mit lstinline darin

Aber um es analysierbar zu machen, musste ich die zusätzlichen Teile \innerhalb der Blöcke manuell hinzufügen, was ich vermeiden möchte.\lstinline\ifdefstring

Antwort1

\lstinlineunterscheidet sich ein wenig von anderen wörtlichen Befehlen, daherdürfenGehen Sie im Argument zu einem anderen Befehl, jedoch mit Einschränkungen.

\elseSie können eine – \fiForm von definieren, \ifdefstringsodass Sie die nicht maskierte Version verwenden können.

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

Ausgabe mit VARnicht gesetztem

Bildbeschreibung hier eingeben

Ausgabe mit VAReingestellt aufyes

Bildbeschreibung hier eingeben

verwandte Informationen