
以前の質問からURL として使用するために特殊文字をエスケープする\string
2 番目の例の特殊な URL 文字をエスケープするために を使用するとうまく機能します。
\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
パラメータのリストを定義します\MyFormatLinkParameters
:
\newcommand*{\DefineMyFormatLinkParameters}[1]{%
\edef\MyFormatLinkParameters{#1}%
}%
しかし、代わりに
\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}]%
}%
パラメータのリストを別のマクロに渡す場合、\DefineMyFormatLinkParametersTypeA
または\DefineMyFormatLinkParametersTypeB
特殊文字の処理に問題が発生します。以下の MWE に従って特殊な TeX 文字を使用しない場合は、問題なく動作します。
ノート
- MWE では、問題のあるケースは の呼び出しでコメント アウトされています
\DefineMyFormatLinkParametersNew
。people.brunel.ac.uk
問題を再現するには、行のコメントを解除します。
コード:
\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}
答え1
すでに l3 と pgf がロードされている場合に xstring を使用するかどうかはわかりませんが、とにかく:
\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}