Übergeben von Zeichenfolgen mit „speziellen“ Catcodes (insbesondere „_“) an benutzerdefinierten NewDocumentCommand-Befehl

Übergeben von Zeichenfolgen mit „speziellen“ Catcodes (insbesondere „_“) an benutzerdefinierten NewDocumentCommand-Befehl

Wie kann ich einen Unterstrich richtig an \newcommand übergeben?schlägt als Lösung die Verwendung eines Befehls ohne Argumente vor, der den Catcode von ändert _, bevor er zum eigentlichen Befehl erweitert wird.

Das ist quasi das Gegenteil von dem Grund, warum ich verwenden möchte \NewDocumentCommand, da es irgendwie umständlich ist und außerdem die Argumenttypen verschleiert.

Gibt es eine Möglichkeit, Zeichenfolgen mit Unterstrichen (übrigens Dateinamen) zu übergeben, ohne den Komfort meiner expl3/xparse/ \NewDocumentCommand-Blase zu verlassen?

Ich möchte keine vArgumente verwenden. Es sollte wirklich wie ein normales Makro funktionieren \includechapter{foo_bar}und nicht wie \includechapter!foo_bar!.


Mein Code derzeit:

%%% Chapter Inclusion Macros
\RequirePackage{expl3}
\ExplSyntaxOn
% Command to include chapter files, if
% either the exclusive chapter list is empty,
% or said chapter is in there
\cs_set:Npn \cel_includechapter:n #1 {
  % Check whether list is empty
  \clist_if_empty:NTF
  \g_cel_enabled_clist % which list
  {\include{#1/#1}} % if empty, just include
  { % else
    % check whether argument in list of enabled chapters
    \clist_if_in:NnTF 
    \g_cel_enabled_clist % in which list
    {#1} % which element to look for
    {\include{#1/#1}} % if in there
    {\chapter{#1~(currently~disabled)}} %if not in there
  }
}
% user-facing command \includechapter
% includes chaptername/chaptername
% if enabled
\NewDocumentCommand{\includechapter}{m}{
  \cel_includechapter:n{#1}
}
\NewDocumentCommand{\enableChapter}{m}{
  \clist_put_right:Nn \g_cel_enabled_clist {#1}
}
\ExplSyntaxOff

Der Build bricht ab, wenn er erreicht

\includechapter{foo_bar}

mit

! Missing $ inserted.
<inserted text>
                $
l.147 \includechapter{foo_bar}

Antwort1

Das Problem ist, wo Sie sagen

{\chapter{#1~(currently~disabled)}} %if not in there

weil ein Unterstrich im Dateinamen den Mathematikmodus auslösen würde.

Lösung: Wechseln Sie zu

{\chapter{\tl_to_str:n {#1}~(currently~disabled)}} %if not in there

Antwort2

vDie Lösung in diesem Fall besteht darin , -type-Argumente zu verwenden :

\NewDocumentCommand{\includechapter}{v}{
  \cel_includechapter:n{#1}
}
\NewDocumentCommand{\enableChapter}{v}{
  \clist_put_right:Nn \g_cel_enabled_clist {#1}
}

Dies erfordert noch weitere Korrekturen, da das übergebene Argument verarbeitet werden muss, bevor es gesetzt werden kann, wenn es Unterstriche enthält.

Glücklicherweise möchte ich dieses Makro nicht als Argument für eine andere Funktion verwenden (usrguide3.pdf):

v: Liest ein Argument „wörtlich“ zwischen dem folgenden Zeichen und seinem nächsten Vorkommen, ähnlich dem Argument des LATEX 2ε-Befehls \verb. Somit vwird ein Argument vom Typ - zwischen zwei identischen Zeichen gelesen, die nicht %, \, #, {, } oder sein können . Das wörtliche Argument kann auch in Klammern { und eingeschlossen werden }.Ein Befehl mit einem wörtlichen Argument erzeugt einen Fehler, wenn er innerhalb eines Arguments einer anderen Funktion erscheint.

verwandte Informationen