Как поставить двоеточие при использовании ExplSyntax

Как поставить двоеточие при использовании ExplSyntax

Не могу поверить, что я первый, кто это спрашивает, но есть ли лучший способ задать буквальное двоеточие ( :) в синтаксисе Expl, чем \str_use:N\c_colon_str? Это довольно неуклюже для таких вещей, как написание URL. Например, я пишу команду для вывода ссылки на определенную страницу на моем сервере примеров, и сейчас это определено так:

\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 / } }

Все эти \str_use:Ns действительно скрывают то, что на самом деле должно быть довольно простой командой.

решение1

Внутри можно напрямую \ExplSyntaxOnчто :-то выводить, как и любую другую букву, если только вам не нужно, чтобы она имела категорию 12, и категория 11 тоже подойдет. Вам нужно только убедиться, что она не «касается» имени макроса, поэтому вы можете использовать , \c_app_proto_str :но не \c_app_proto_str:.

Кроме того, для переменных strи метод доступа не является строго необходимым, и его можно опустить.tl\..._use:N

Таким образом, ваш фрагмент кода можно сократить до

\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 / } }

Спасибо Ульрике Фишер за то, что она указала на то, что первый аргумент \hrefдолжен иметь двоеточие категории 12, поэтому нам нужно использовать \c_colon_strего.

решение2

Основная проблема заключается в том, что \hrefтребуется увидеть явный символьный токен :категории кода 12, чтобы записать правильную ссылку в PDF-файл, изолировав протокол от остального.

Это можно сделать в три шага.

\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}

введите описание изображения здесь

Я не уверен, что вам нужен завершающий /.

Что я делаю? Я определяю универсальную \ar_href:nnnфункцию, которую можно использовать также в разных контекстах (например, для других протоколов), и ее вариант, который принимает строковые константы в качестве аргументов.

Из-за особого состояния двоеточия лучше сделать следующий шаг, поэтому эта функция фактически вызывает другую, где первый аргумент через вариант предоставит двоеточию правильный код категории.

Было бы намного проще, если бы вы добавили двоеточие к protконстанте:

\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}

Связанный контент