我在宏中使用时遇到问题/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 的注释字符。因此,我们希望不读取此符号后面的任何内容。