\href 不会忽略宏内的特殊字符

\href 不会忽略宏内的特殊字符

我在宏中使用时遇到问题/href。宏如下所示:

\newboolean{isLast}

\def\addSection#1#2#3#4{
\begin{center}
    \begin{minipage}[t]{\pictureSize}
        \vspace{0pt}\center{\huge #1}
    \end{minipage}\hfill
    \begin{minipage}[t]{\dimexpr\textBlockSize}
        {\large \textbf{#2}\par}
        \smallskip
        #3
        \setboolean{isLast}{#4}
        \ifthenelse{\boolean{isLast}}{}{\bigskip\hrule}
    \end{minipage}
\end{center}
}

它将新的结构化部分添加到列表中,参数为 #1 项目数、#2 标题、#3 正文和 #4 布尔值,\hrule根据部分是否为最后一个部分来显示或隐藏。这是我收到错误的地方:

\addAcomplishmentsSection{2}
{Title}{
\begin{tabular}{l l r}
Blah & Blah & \href{http://www.url.org/%}{show certificate} \\ % error because of %
Blah & Blah & \href{https://www.url.org/}{show certificate} % no error
\end{tabular}
}{false}

因此,如果 URL 中包含符号%,我就会收到此错误:

Paragraph ended before \addSection was complete <to be read again>

答案1

您可以按照我在评论中建议的方式更改类别代码%。以下方法可能有效:(请注意,评论无效)

\documentclass[]{article}

\usepackage{ifthen}
\usepackage{hyperref}

\newboolean{isLast}
\newlength\pictureSize
\pictureSize=3cm\relax
\newlength\textBlockSize
\textBlockSize=10cm\relax

\def\addSection#1#2#3#4{
\begin{center}
    \begin{minipage}[t]{\pictureSize}
        \vspace{0pt}\center{\huge #1}
    \end{minipage}\hfill
    \begin{minipage}[t]{\dimexpr\textBlockSize}
        {\large \textbf{#2}\par}
        \smallskip
        #3
        \setboolean{isLast}{#4}
        \ifthenelse{\boolean{isLast}}{}{\bigskip\hrule}
    \end{minipage}
\end{center}
}

\newcommand{\makepercentother}{\catcode`\%=12\relax}
\newcommand{\makepercentcomment}{\catcode`\%=14\relax}

\begin{document}
\makepercentother
\addSection{2}
{Title}{
\begin{tabular}{l l r}
Blah & Blah & \href{http://www.url.org/%}{show certificate} \\ % error because of %
Blah & Blah & \href{https://www.url.org/}{show certificate} % no error
\end{tabular}
}{false}
\makepercentcomment
\end{document}

请注意,您必须用\addSection这个来包围它,因为类别代码必须在宏调用之前更改,而宏调用的参数应该包含应该更改类别代码的字符。

另一种可能性是在没有注释字符的较小环境中定义 URL%并使用它(这样注释就会起作用):

\documentclass[]{article}

\usepackage{ifthen}
\usepackage{hyperref}

\newboolean{isLast}
\newlength\pictureSize
\pictureSize=3cm\relax
\newlength\textBlockSize
\textBlockSize=10cm\relax


\def\addSection#1#2#3#4{
\begin{center}
    \begin{minipage}[t]{\pictureSize}
        \vspace{0pt}\center{\huge #1}
    \end{minipage}\hfill
    \begin{minipage}[t]{\dimexpr\textBlockSize}
        {\large \textbf{#2}\par}
        \smallskip
        #3
        \setboolean{isLast}{#4}
        \ifthenelse{\boolean{isLast}}{}{\bigskip\hrule}
    \end{minipage}
\end{center}
}

\newcommand{\makepercentother}{\catcode`\%=12\relax}
\newcommand{\makepercentcomment}{\catcode`\%=14\relax}

\makepercentother
\def\myURL{http://www.url.org/%}
\makepercentcomment

\begin{document}
\addSection{2}
{Title}{
\begin{tabular}{l l r}
Blah & Blah & \href{\myURL}{show certificate} \\ % error because of %
Blah & Blah & \href{https://www.url.org/}{show certificate} % no error
\end{tabular}
}{false}
\end{document}

建议的基于环境的解决方案(感谢 Ulrike Fischer 的提议)的一种方式如下。它不需要任何类别代码更改。

\documentclass[]{article}

\usepackage{ifthen}
\usepackage{hyperref}

\newboolean{isLast}
\newlength\pictureSize
\pictureSize=3cm\relax
\newlength\textBlockSize
\textBlockSize=10cm\relax


\newenvironment{envAddSection}[3]
{%
  \begin{center}%
    \begin{minipage}[t]{\pictureSize}%
      \vspace{0pt}\center{\huge #1}%
    \end{minipage}\hfill%
    \begin{minipage}[t]{\dimexpr\textBlockSize}%
      {\large \textbf{#2}\par}%
      \setboolean{isLast}{#3}%
      \smallskip%
}{%
      \ifthenelse{\boolean{isLast}}{}{\bigskip\hrule}%
    \end{minipage}%
  \end{center}%
}

\begin{document}
\begin{envAddSection}{2}{Title}{false}
  \begin{tabular}{l l r}
    Blah & Blah & \href{http://www.url.org/%}{show certificate} \\ % error because of %
    Blah & Blah & \href{https://www.url.org/}{show certificate} % no error
  \end{tabular}
\end{envAddSection}
\end{document}

答案2

您需要转义,%因为它是注释。改用\%就可以了。

这与字符有关。虽然_等安全地传递给\href%但被设置为 TeX 的注释字符。因此,我们希望不读取此符号后面的任何内容。

相关内容