
Ich verwende \ifdefstring
als 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 \lstinline
enthaltenes Backslash habe, diese maskieren muss, da es sonst nicht funktioniert.
Ich möchte Blöcke hinzufügen können, \ifdefstring
ohne 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:
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
\lstinline
unterscheidet sich ein wenig von anderen wörtlichen Befehlen, daherdürfenGehen Sie im Argument zu einem anderen Befehl, jedoch mit Einschränkungen.
\else
Sie können eine – \fi
Form von definieren, \ifdefstring
sodass 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}