Makroerweiterung innerhalb von \href

Makroerweiterung innerhalb von \href

Ich möchte eine Verknüpfung erstellen für

\href{tel:0123456789}{01\,23\,45\,67\,89}

Ich kann \StrSubstituteaus dem xstringPaket 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 \StrSubstitutein 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 xstringBefehle 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}

Bildbeschreibung hier eingeben

verwandte Informationen