
Ich möchte eine Verknüpfung erstellen für
\href{tel:0123456789}{01\,23\,45\,67\,89}
Ich kann \StrSubstitute
aus dem xstring
Paket verwenden als
\StrSubstitute{01 23 45 67 89}{ }{\,}
innerhalb des zweiten Arguments zu href
. Aber das gleiche gilt mit
\StrSubstitute{01 23 45 67 89}{ }{}
im ersten Argument funktioniert nicht.
Ich glaube, ich verstehe, dass dies ein Problem mit der Reihenfolge der Makroerweiterung ist. Aber wie kann ich LaTeX dazu bringen, zuerst \StrSubstitute
in einen String zu expandieren, der von\href
?
Hier ist ein Minimalbeispiel dessen, was ich eigentlich erreichen möchte:
\documentclass{minimal}
\usepackage{xstring}
\usepackage{hyperref}
\newcommand\phone[1]{\href{tel:\StrSubstitute{#1}{ }{}}{\StrSubstitute{#1}{ }{\,}}}
\begin{document}
\href{tel:0123456789}{01\,23\,45\,67\,89}
\href{\StrSubstitute{01 23 45 67 89}{ }{}}{\StrSubstitute{01 23 45 67 89}{ }{\,}}
\phone{01 23 45 67 89}
\end{document}
Bearbeiten: Das paarweise Muster ist nicht wichtig, da verschiedene Länder unterschiedliche Konventionen für Zahlenformate haben. Ich möchte wirklich nur Leerzeichen ersetzen/entfernen (und vielleicht andere Dinge).
Antwort1
Erweitern Sie die ZeichenfolgensubstitutionErsteindem Sie es in einem Argument speichern, das Sie dann verwenden können mithyperref
'S \href
:
\documentclass{article}
\usepackage{xstring}
\usepackage{hyperref}
\newcommand\phone[1]{%
\StrSubstitute{#1}{ }{}[\firstarg]% Store first substitution in \firstarg
\StrSubstitute{#1}{ }{\,}[\secondarg]% Store second substitution in \secondarg
\href{tel:\firstarg}{\secondarg}% Use stored arguments in \href
}
\begin{document}
\href{tel:0123456789}{01\,23\,45\,67\,89}
\phone{01 23 45 67 89}
\end{document}
Antwort2
Die xstring
Befehle sind nicht erweiterbar und können daher im Allgemeinen nicht inline in anderen Befehlen verwendet werden. Sie können hier einen einfachen erweiterbaren Ersatz verwenden.
\documentclass{minimal}
\usepackage{hyperref}
\makeatletter
\def\zza#1 {#1\zza}
\def\zzb#1 {#1\,\zzb}
\newcommand\phone[1]{{\def\!##1{}\def\$##1##2{}\href{tel:\zza#1\! }{\zzb#1\$ }}}
\makeatother
\begin{document}
\href{tel:0123456789}{01\,23\,45\,67\,89}
\phone{01 23 45 67 89}
\end{document}
Antwort3
Sie können es an diesen Stellen nicht verwenden \StrSubstitute
, da dadurch nach der Ersetzung nicht die Zeichenfolge erzeugt wird, sondern ein ziemlich komplizierter Satz von Anweisungen zum Erzeugen dieser Zeichenfolge.
Eine kompliziertere Lösung, bei der die Eingabe von Leerzeichen zwischen Ziffernpaaren vermieden wird, sodass die Lösung auch dann funktioniert, wenn Sie diese vergessen.
\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref}
\ExplSyntaxOn
\NewDocumentCommand{\phone}{m}
{
\dlichti_phone:n { #1 }
}
\tl_new:N \l_dlichti_phone_href_tl
\tl_new:N \l_dlichti_phone_print_tl
\cs_new_protected:Nn \dlichti_phone:n
{
\tl_set:Nx \l_dlichti_phone_href_tl { #1 }
% remove all spaces
\tl_replace_all:Nnn \l_dlichti_phone_href_tl { ~ } { }
% save a copy
\tl_set_eq:NN \l_dlichti_phone_print_tl \l_dlichti_phone_href_tl
% insert a thin space between any pair of digits
\regex_replace_all:nnN
{ ([0-9][0-9]) } % two digits followed by another digit
{ \1\c{,} } % the same with \, in between
\l_dlichti_phone_print_tl
% remove the trailing \,
\regex_replace_once:nnN { \c{,} \Z } { } \l_dlichti_phone_print_tl
\dlichti_phone_href:VVV
\c_colon_str
\l_dlichti_phone_href_tl
\l_dlichti_phone_print_tl
}
\cs_new_protected:Nn \dlichti_phone_href:nnn
{
\href{tel#1#2}{#3}
}
\cs_generate_variant:Nn \dlichti_phone_href:nnn { VVV }
\ExplSyntaxOff
\begin{document}
\phone{01 23 45 67 89}
\phone{0123456789}
\end{document}