Wie verwende ich das Ergebnis eines Makros und nicht das Makro selbst?

Wie verwende ich das Ergebnis eines Makros und nicht das Makro selbst?

Ich möchte das Ergebnis eines Makros (das akzentuierte Zeichen einer String-Variable namens löscht \name), das in einer Variable namens gespeichert ist \nameSA, in einer URL verwenden. Ich dachte, ich könnte es \nameSAdirekt im URL-Argument verwenden, wie ich es mit meiner ursprünglichen Variable tun kann \name, aber die URL sieht das Makro und nicht das Ergebnis des Makros. Können Sie mir bitte sagen, wie ich das Ergebnis des Makros anstelle des Makros selbst speichern und wiederverwenden kann? Ich habe gesucht und verschiedene Optionen ausprobiert, aber alles war erfolglos...

Hier ist der Code:

\documentclass[11pt]{article}

\usepackage{luatextra}
\usepackage[french]{babel}
\usepackage[pdfencoding=unicode,breaklinks=true,hyperindex,colorlinks=true,linkcolor=black,urlcolor=blue]{hyperref}
\usepackage{xstring}

%This is the macro to delete accents in a string
\makeatletter
\def\delaccent[#1]#2{% #1=liste des substitutions
\begingroup
\expandarg\exploregroups\edef\temp{#2}%
\delaccent@i#1\delaccent@i\delaccent@i
\expandafter\temp\endgroup}
\def\delaccent@i#1#2{\ifx\delaccent@i#1\else\StrSubstitute\temp{\noexpand#1}{\noexpand#2}[\temp]\expandafter\delaccent@i\fi}
\makeatother

% I define a string with accentuated characters and I use the previous macro to delete accents.
\newcommand{\name}{énergie}
\newcommand\nameSA{\delaccent[{à}{a}{é}{e}{è}{e}{ë}{e}{ê}{e}{ï}{i}{ô}{o}{ù}{u}]{\name}}

\begin{document}
Name with accents : \name

Name without accent : \nameSA % --> Works fine

URL with accents : \url{https://www.\name.com} --> Works fine

URL without accent : \url{https://www.\nameSA.com} %--> Did not work (compilation failed)
\end{document}

Vielen Dank im Voraus für Ihre Hilfe !

Antwort1

Ich schlage eine andere Strategie vor, da \urles nicht möglich ist, alle Ersetzungen vor dem Drucken des Namens auszuführen und auch aus Effizienzgründen.

\documentclass[11pt]{article}

\usepackage{luatextra}
\usepackage[french]{babel}
\usepackage{xstring}
\usepackage{hyperref}

\makeatletter
\newcommand{\delaccent}[3][]{% #1=liste des substitutions
  \begingroup
  \expandarg\exploregroups\edef\temp{#3}%
  \delaccent@i#2\delaccent@i\delaccent@i
  \if\relax\detokenize{#1}\relax
    \temp
    \expandafter\endgroup
  \else
    \edef\x{\endgroup\noexpand\newcommand\noexpand#1{\temp}}%
    \expandafter\x
  \fi
}
\def\delaccent@i#1#2{%
  \ifx\delaccent@i#1%
  \else
    \StrSubstitute\temp{\noexpand#1}{\noexpand#2}[\temp]%
  \expandafter\delaccent@i
 \fi
}
\makeatother

\newcommand{\declarestring}[3]{%
  \newcommand{#1}{#3}%
  \delaccent[#2]{{à}{a}{é}{e}{è}{e}{ë}{e}{ê}{e}{ï}{i}{ô}{o}{ù}{u}}{#3}%
}


\declarestring{\name}{\nameSA}{Michaël}

\begin{document}

Name : \name

Try 1 : \delaccent{{à}{a}{é}{e}{è}{e}{ë}{e}{ê}{e}{ï}{i}{ô}{o}{ù}{u}}{Michaël}

Try 2 : \delaccent{{à}{a}{é}{e}{è}{e}{ë}{e}{ê}{e}{ï}{i}{ô}{o}{ù}{u}}{\name}

Try 3 : \nameSA


Name with accents : \name

Name without accent : \nameSA % --> Works fine

URL with accents : \url{https://www.\name.com}

URL without accent : \url{https://www.\nameSA.com}

\end{document}

Definiert also \definestringsowohl die „normale“ Zeichenfolge als auch die „ohne Akzent“.

Beachten Sie, dass die neu gestaltete Version über \delaccentein optionales Argument verfügt, das einen Makronamen enthalten kann, der für die Zeichenfolge „ohne Akzent“ definiert wird. Wenn kein optionales Argument vorhanden ist, wird die Zeichenfolge „ohne Akzent“ gedruckt.

Bildbeschreibung hier eingeben


Eine andere Implementierung, möglicherweise mit einer besseren Syntax für die Ersetzungen:

\documentclass[11pt]{article}

\usepackage{luatextra}
\usepackage[french]{babel}
\usepackage{xparse,l3regex}
\usepackage{hyperref}

\ExplSyntaxOn
\NewDocumentCommand{\delaccent}{omm}
 {
  \IfNoValueTF{#1}
   {
    \nezluge_delaccent:nnn { #2 } { #3 } { \tl_use:N }
   }
   {
    \nezluge_delaccent:nnn { #2 } { #3 } { \tl_set:NV #1 }
   }
 }

\NewDocumentCommand{\declarestring}{mmm}
 {
  \tl_set:Nx #1 { #3 }
  \delaccent [ #2 ] { à/a, é/e, è/e, ë/e, ê/e, ï/i, ô/o, ù/u } {#3}
}

\tl_new:N \l__nezluge_delaccent_string_tl

\cs_new_protected:Nn \nezluge_delaccent:nnn
 {
  \tl_set:Nx \l__nezluge_delaccent_string_tl { #2 }
  \clist_map_inline:nn { #1 }
   {
    \__nezluge_delaccent_replace:n { ##1 }
   }
  #3 \l__nezluge_delaccent_string_tl
 }

\cs_new_protected:Nn \__nezluge_delaccent_replace:n
 {
  \__nezluge_delaccent_replace_aux:w #1 \q_stop
 }

\cs_new_protected:Npn \__nezluge_delaccent_replace_aux:w #1 / #2 \q_stop
 {
  \regex_replace_all:nnN { #1 } { #2 } \l__nezluge_delaccent_string_tl
 }

\ExplSyntaxOff

\declarestring{\name}{\nameSA}{Michaël}

\begin{document}

Name : \name

Try 1 : \delaccent{à/a, é/e, è/e, ë/e, ê/e, ï/i, ô/o, ù/u}{Michaël}

Try 2 : \delaccent{à/a, é/e, è/e, ë/e, ê/e, ï/i, ô/o, ù/u}{\name}

Try 3 : \nameSA


Name with accents : \name

Name without accent : \nameSA % --> Works fine

URL with accents : \url{https://www.\name.com}

URL without accent : \url{https://www.\nameSA.com}

\end{document}

Die Ausgabe ist die gleiche.

verwandte Informationen