
Не могу поверить, что я первый, кто это спрашивает, но есть ли лучший способ задать буквальное двоеточие ( :
) в синтаксисе 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:N
s действительно скрывают то, что на самом деле должно быть довольно простой командой.
решение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}