So legen Sie bei Verwendung von ExplSyntax einen Doppelpunkt fest

So legen Sie bei Verwendung von ExplSyntax einen Doppelpunkt fest

Ich kann nicht glauben, dass ich der Erste bin, der das fragt, aber gibt es eine bessere Möglichkeit, einen wörtlichen Doppelpunkt ( :) innerhalb der Expl-Syntax zu setzen als \str_use:N\c_colon_str? Das ist ziemlich umständlich, wenn es um Dinge wie das Schreiben einer URL geht. Ich schreibe beispielsweise einen Befehl, um einen Link zu einer bestimmten Seite auf meinem Beispielserver auszudrucken, und im Moment ist das so definiert:

\NewDocumentCommand \server { m }
{ \href { \str_use:N \c_app_proto_str \str_use:N \c_colon_str // \str_use:N \c_app_host_str / #1 / }
        { \str_use:N \c_app_proto_str \str_use:N \c_colon_str // \linebreak[2]
          \str_use:N \c_app_host_str / \linebreak[2] #1 / } }

Alle diese \str_use:N„s“ verschleiern tatsächlich einen Befehl, der eigentlich ziemlich einfach sein sollte.

Antwort1

Innerhalb von \ExplSyntaxOnkann :wie bei jedem anderen Buchstaben auch direkt etwas ausgegeben werden, sofern du es nicht wirklich brauchst. Kategorie 12 und Kategorie 11 wären auch in Ordnung. Du musst nur darauf achten, dass es keinen Makronamen „berührt“, also kannst du verwenden, \c_app_proto_str :aber nicht \c_app_proto_str:.

Auch für strund tlVariablen ist der \..._use:NAccessor nicht unbedingt erforderlich und Sie können ihn weglassen.

Ihr Code-Snippet kann daher verkürzt werden auf

\NewDocumentCommand \server { m }
{ \href { \c_app_proto_str \c_colon_str // \c_app_host_str / #1 / }
        { \c_app_proto_str :// \linebreak[2]
          \c_app_host_str / \linebreak[2] #1 / } }

Vielen Dank an Ulrike Fischer für den Hinweis, dass das erste Argument \hrefeinen Doppelpunkt der Kategorie 12 enthalten muss, weshalb wir ihn dort verwenden müssen \c_colon_str.

Antwort2

Das Hauptproblem besteht darin, dass \hrefein explizites Zeichentoken :der Kategoriecode 12 angezeigt werden muss, um den richtigen Link in die PDF-Datei zu schreiben und das Protokoll vom Rest zu isolieren.

Dies ist in drei Schritten möglich.

\documentclass{article}
\usepackage{hyperref}

\ExplSyntaxOn

\NewDocumentCommand \server { m }
 {
  \ar_href:VVn \c_app_proto_str \c_app_host_str { #1 }
 }

\cs_new_protected:Nn \ar_href:nnn
 {% we need one more technical step for the colon
  \__ar_href:Vnnn \c_colon_str { #1 } { #2 } { #3 }
 }
\cs_new_protected:Nn \__ar_href:nnnn
 {
  \href { #2 #1 // #3 / #4 / }
        { #2 #1 // \linebreak[2] #3 / \linebreak[2] #4 / }
 }
\cs_generate_variant:Nn \__ar_href:nnnn { V }
\cs_generate_variant:Nn \ar_href:nnn { VV }

\str_const:Nn \c_app_proto_str { https }
\str_const:Nn \c_app_host_str { example.com }

\ExplSyntaxOff

\begin{document}

\server{whatever}

\end{document}

Bildbeschreibung hier eingeben

Ich bin nicht sicher, ob Sie das nachfolgende möchten /.

Was mache ich? Ich definiere eine generische \ar_href:nnnFunktion, die Sie auch in anderen Kontexten verwenden können (zum Beispiel für andere Protokolle) und eine Variante davon, die die Stringkonstanten als Argumente verwendet.

Aufgrund der besonderen Beschaffenheit des Doppelpunkts ist ein weiterer Schritt sinnvoller, weshalb diese Funktion tatsächlich eine weitere aufruft, bei der das erste Argument über eine Variante dem Doppelpunkt den richtigen Kategoriencode zuweist.

Es wäre viel einfacher, wenn Sie der protKonstanten einen Doppelpunkt hinzufügen:

\documentclass{article}
\usepackage{hyperref}

\ExplSyntaxOn

\NewDocumentCommand \server { m }
 {
  \ar_href:VVn \c_app_proto_str \c_app_host_str { #1 }
 }

\cs_new_protected:Nn \ar_href:nnn
 {
  \href { #1 // #2 / #3 / }
        { #1 // \linebreak[2] #2 / \linebreak[2] #3 / }
 }
\cs_generate_variant:Nn \ar_href:nnn { VV }

\str_const:Nn \c_app_proto_str { https: }
\str_const:Nn \c_app_host_str { example.com }

\ExplSyntaxOff

\begin{document}

\server{whatever}

\end{document}

verwandte Informationen