
я использую\ifdefstring
как часть условного определения, которое зависит от переменной окружения, как указанов этом вопросе.
В основном это работает нормально, за исключением того, что внутри блоков, определенных с помощью \ifdefstring
, если у меня есть \lstinline
содержащиеся обратные косые черты, мне нужно экранировать их, иначе это не сработает.
Я хотел бы иметь возможность добавлять \ifdefstring
блоки без необходимости экранирования/разэкранирования того, что внутри, особенно потому, что сообщение об ошибке не очень понятно: отсутствие обратных косых черт приводит к появлению загадочных сообщений об ошибках в конце блока. Есть ли способ сделать это?
Вот MVE, где в каждом случае (как внутри, так и снаружи \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}
\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}
Вывод (здесь, с VAR != yes
) следующий:
Но чтобы сделать его пригодным для анализа, мне пришлось вручную добавлять лишнее \
в \lstinline
части внутри \ifdefstring
блоков, чего я хотел бы избежать.
решение1
\lstinline
немного отличается от других дословных команд, поэтомуможетперейти в аргумент к другой команде, но с ограничениями.
Вы можете определить форму \else
– , чтобы использовать неэкранированную версию.\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}