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 \nameSA
direkt 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 \url
es 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 \definestring
sowohl die „normale“ Zeichenfolge als auch die „ohne Akzent“.
Beachten Sie, dass die neu gestaltete Version über \delaccent
ein 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.
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.