Me gustaría utilizar el resultado de una macro (que elimina caracteres acentuados de una variable de cadena llamada \name
), guardada en una variable llamada \nameSA
, en una url. Pensé que podría usar el \nameSA
argumento directamente en la URL como puedo hacerlo con mi variable original \name
, pero la URL ve la macro y no el resultado de la macro. ¿Podría decirme cómo puedo guardar y reutilizar el resultado de la macro en lugar de la macro misma? Busqué y probé diferentes opciones pero no tuve éxito...
Aquí está el código:
\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}
Gracias de antemano por su ayuda !
Respuesta1
Propongo una estrategia diferente, porque \url
no es capaz de ejecutar todas las sustituciones antes de imprimir el nombre y además para una mejor eficiencia.
\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}
Así \definestring
define tanto la cadena "normal" como la "sin acento".
Tenga en cuenta que la versión rediseñada de \delaccent
tiene un argumento opcional que puede contener un nombre de macro, que se definirá en la cadena "desaccentada"; si no hay ningún argumento opcional, se imprime la cadena "desacentuada".
Una implementación diferente, quizás con una mejor sintaxis para los reemplazos:
\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}
La salida es la misma.