
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 \ExplSyntaxOn
kann :
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 str
und tl
Variablen ist der \..._use:N
Accessor 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 \href
einen Doppelpunkt der Kategorie 12 enthalten muss, weshalb wir ihn dort verwenden müssen \c_colon_str
.
Antwort2
Das Hauptproblem besteht darin, dass \href
ein 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}
Ich bin nicht sicher, ob Sie das nachfolgende möchten /
.
Was mache ich? Ich definiere eine generische \ar_href:nnn
Funktion, 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 prot
Konstanten 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}