매크로 자체가 아닌 매크로 결과를 사용하는 방법은 무엇입니까?

매크로 자체가 아닌 매크로 결과를 사용하는 방법은 무엇입니까?

\name이라는 변수에 저장된 매크로( 이라는 문자열 변수의 강조 문자 삭제) 의 결과를 \nameSAURL에 사용하고 싶습니다 . \nameSA원래 변수로 할 수 있는 것처럼 url 인수에서 직접 사용할 수 있다고 생각했지만 \nameurl은 매크로의 결과가 아니라 매크로를 봅니다. 매크로 자체 대신 매크로 결과를 저장하고 재사용할 수 있는 방법을 알려주시겠습니까? 다양한 옵션을 검색하고 시도했지만 실패했습니다.

코드는 다음과 같습니다.

\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}

당신의 도움에 미리 감사드립니다 !

답변1

\url이름을 인쇄하기 전에는 모든 대체를 실행할 수 없고 더 나은 효율성을 위해 다른 전략을 제안합니다 .

\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}

따라서 \definestring"일반" 문자열과 "산 액센트" 문자열을 모두 정의합니다.

다시 디자인된 버전에는 \delaccent"deaccented" 문자열에 정의될 매크로 이름을 포함할 수 있는 선택적 인수가 있습니다. 선택적 인수가 없으면 "deaccented" 문자열이 인쇄됩니다.

여기에 이미지 설명을 입력하세요


대체를 위한 더 나은 구문을 사용하는 다른 구현:

\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}

출력은 동일합니다.

관련 정보