
De una pregunta anterior en adelanteEscapar de caracteres especiales para usarlos como URL, usar \string
para escapar los caracteres especiales de URL en el segundo ejemplo funciona muy bien:
\DefineMyFormatLinkParameters{%
*[Main Search Site]{Google}{http://www.google.com},
{people.brunel.ac.uk}{http://people.brunel.ac.uk/\string~mastmmg/ssguide/set\string_work.html\string#4\string_32},
{Yahoo}{http://www.yahoo.com}
}
\DefineMyFormatLinkParameters
define una lista de parámetros en \MyFormatLinkParameters
:
\newcommand*{\DefineMyFormatLinkParameters}[1]{%
\edef\MyFormatLinkParameters{#1}%
}%
Sin embargo, si en lugar de eso uso
\newcommand*{\DefineMyFormatLinkParametersNew}[2][TypeB]{%
%\edef\MyFormatLinkParametersNew{#2}% Don't assign it here directly,
% but pass it along
\IfStrEqCase{#1}{%
{TypeA}{\DefineMyFormatLinkParametersTypeA{#2}}%
{TypeB}{\DefineMyFormatLinkParametersTypeB{#2}}%
}[\typeout{*** ERROR: Unknown link type: #1}]%
}%
que pasa la lista de parámetros a otra macro, \DefineMyFormatLinkParametersTypeA
o \DefineMyFormatLinkParametersTypeB
, hay un problema en el procesamiento de los caracteres especiales. Todo funciona bien para los casos que no utilizan caracteres TeX especiales según el MWE a continuación:
Notas
- En MWE, el caso del problema se comenta en la llamada a
\DefineMyFormatLinkParametersNew
. Descomente lapeople.brunel.ac.uk
línea para reproducir el problema.
Código:
\documentclass{article}
\usepackage{url}
\usepackage{pgffor}
\usepackage{xparse}
\usepackage{xstring}
\usepackage[colorlinks=true]{hyperref}
\NewDocumentCommand{\FormatLinks}{%
s% #1 =* not used yet
O{}% #2 = optional title
m% #3 = Mandatory title
m% #4 = URL Link
}{%
\par
\hspace*{1.0cm}\href{#4}{#3\IfValueT{#2}{~(#2)}}%
}%
\newcommand*{\MyFormatLinkParameters}{}% Initialize
\newcommand*{\DefineMyFormatLinkParameters}[1]{%
\edef\MyFormatLinkParameters{#1}%
}%
%% \DefineMyFormatLinkParametersNew (compared to \DefineMyFormatLinkParameters) has
%% one extra level of macro processing based on the optional #1 parameter
\newcommand*{\Title}{}%
\newcommand*{\DefineMyFormatLinkParametersTypeA}[1]{%
\edef\MyFormatLinkParametersNew{#1}%
\def\Title{Type A Links}%
}%
\newcommand*{\DefineMyFormatLinkParametersTypeB}[1]{%
\edef\MyFormatLinkParametersNew{#1}%
\def\Title{Type B Links}%
}%
\newcommand*{\DefineMyFormatLinkParametersNew}[2][TypeB]{%
%\edef\MyFormatLinkParametersNew{#2}% Don't assign it here directly,
% but pass it along
\IfStrEqCase{#1}{%
{TypeA}{\DefineMyFormatLinkParametersTypeA{#2}}%
{TypeB}{\DefineMyFormatLinkParametersTypeB{#2}}%
}[\typeout{*** ERROR: Unknown link type: #1}]%
}%
\begin{document}
% ------------------------------- First version: works fine.
\DefineMyFormatLinkParameters{%
*[Main Search Site]{Google}{http://www.google.com},
{people.brunel.ac.uk}{http://people.brunel.ac.uk/\string~mastmmg/ssguide/set\string_work.html\string#4\string_32},
{Yahoo}{http://www.yahoo.com}
}
\foreach \x in \MyFormatLinkParameters {%
\typeout{DEBUG: "\x"}
\expandafter\FormatLinks\x
}%
%------------------------------- Second version: Not working if uncomment
% people.burnel.ac.uk. Only difference
% is that it has one extra level of macro
% processing which causes some problem!
\DefineMyFormatLinkParametersNew[TypeB]{%
*[Main Search Site]{Google}{http://www.google.com},
%{people.brunel.ac.uk}{http://people.brunel.ac.uk/\string~mastmmg/ssguide/set\string_work.html\string#4\string_32},
{Yahoo}{http://www.yahoo.com}
}
\bigskip\Title:%
\foreach \x in \MyFormatLinkParametersNew {%
\typeout{DEBUG: "\x"}
\expandafter\FormatLinks\x
}
\end{document}
Respuesta1
No estoy seguro de usar xstring si ya tienes l3 y pgf cargados, pero de todos modos:
\documentclass{article}
\usepackage{url}
\usepackage{pgffor}
\usepackage{xparse}
\usepackage{xstring}
\usepackage[colorlinks=true]{hyperref}
\NewDocumentCommand{\FormatLinks}{%
s% #1 =* not used yet
O{}% #2 = optional title
m% #3 = Mandatory title
m% #4 = URL Link
}{%
\par
\hspace*{1.0cm}\href{#4}{#3\IfValueT{#2}{~(#2)}}%
}%
\newcommand*{\MyFormatLinkParameters}{}% Initialize
\newcommand*{\DefineMyFormatLinkParameters}[1]{%
\edef\MyFormatLinkParameters{#1}%
}%
%% \DefineMyFormatLinkParametersNew (compared to \DefineMyFormatLinkParameters) has
%% one extra level of macro processing based on the optional #1 parameter
\newcommand*{\Title}{}%
\newcommand*{\DefineMyFormatLinkParametersTypeA}[1]{%
\edef\MyFormatLinkParametersNew{#1}%
\def\Title{Type A Links}%
}%
\newcommand*{\DefineMyFormatLinkParametersTypeB}[1]{%
\edef\MyFormatLinkParametersNew{#1}%
\def\Title{Type B Links}%
}%
\newcommand*{\DefineMyFormatLinkParametersNew}[2][TypeB]{%
%\edef\MyFormatLinkParametersNew{#2}% Don't assign it here directly,
% but pass it along
\edef\tempz{\unexpanded{#2}}%
\IfStrEqCase{#1}{%
{TypeA}{\DefineMyFormatLinkParametersTypeA{\tempz}}%
{TypeB}{\DefineMyFormatLinkParametersTypeB{\tempz}}%
}[\typeout{*** ERROR: Unknown link type: #1}]%
}%
\begin{document}
% ------------------------------- First version: works fine.
\DefineMyFormatLinkParameters{%
*[Main Search Site]{Google}{http://www.google.com},
{people.brunel.ac.uk}{http://people.brunel.ac.uk/\string~mastmmg/ssguide/set\string_work.html\string#4\string_32},
{Yahoo}{http://www.yahoo.com}
}
\foreach \x in \MyFormatLinkParameters {%
\typeout{DEBUG: "\x"}
\expandafter\FormatLinks\x
}%
%------------------------------- Second version: Not working if uncomment
% people.burnel.ac.uk. Only difference
% is that it has one extra level of macro
% processing which causes some problem!
\DefineMyFormatLinkParametersNew[TypeB]{%
*[Main Search Site]{Google}{http://www.google.com},
{people.brunel.ac.uk}{http://people.brunel.ac.uk/\string~mastmmg/ssguide/set\string_work.html\string#4\string_32},
{Yahoo}{http://www.yahoo.com}
}
\bigskip\Title:%
\foreach \x in \MyFormatLinkParametersNew {%
\typeout{DEBUG: "\x"}
\expandafter\FormatLinks\x
}
\end{document}