Gostaria de utilizar o resultado de uma macro (que exclua caracteres acentuados de uma variável string chamada \name
), salva em uma variável chamada \nameSA
, em uma url. Achei que poderia usar o \nameSA
argumento diretamente no url, como faço com minha variável original \name
, mas o url vê a macro e não o resultado da macro. Você poderia me dizer como posso salvar e reutilizar o resultado da macro em vez da própria macro? Procurei e tentei diversas opções, mas não tive sucesso...
Aqui está o 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}
Agradeço antecipadamente por sua ajuda !
Responder1
Proponho uma estratégia diferente, pois \url
não é possível executar todas as substituições antes de imprimir o nome e também para melhor eficiência.
\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}
Assim \definestring
define tanto a string “normal” quanto a “sem acento”.
Observe que a versão redesenhada de \delaccent
possui um argumento opcional que pode conter um nome de macro, que será definido para a string “deacentuada”; se não houver nenhum argumento opcional, a string “deaccented” será impressa.
Uma implementação diferente, talvez com uma sintaxe melhor para as substituições:
\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}
A saída é a mesma.