url
的文档声称,\url{...}
如果用于另一个命令的参数,则不能包含任何%
、、#
或^^
或以结尾的参数\
(尽管这可以通过\urldef
的 URL 来绕过,如下所示)。
但事实证明,如果\url{...}
的参数包含#
并在分段命令的参数中使用:
- 奇怪的是:它对
\part
、\chapter
、\section
、\subsection
、 非常有效\subsubsection
- 非常奇怪:它不适用于其他分段命令:
\paragraph
和\subparagraph
(非常奇怪!)。它失败并出现错误:\@svsechd 定义中的参数数量非法。
您是否看到这些差异的原因(特别是后者)?
\documentclass{report}
\usepackage{url}
\urldef{\myparturl}\url{https://www.nowhere.org/#part}
\urldef{\mychapterurl}\url{https://www.nowhere.org/#chapter}
\urldef{\mysectionurl}\url{https://www.nowhere.org/#section}
\urldef{\mysubsectionurl}\url{https://www.nowhere.org/#subsection}
\urldef{\mysubsubsectionurl}\url{https://www.nowhere.org/#subsubsection}
\urldef{\myparagraphurl}\url{https://www.nowhere.org/#paragraph}
\urldef{\mysubparagraphurl}\url{https://www.nowhere.org/#subparagraph}
\begin{document}
\part[No sharp]{No sharp: \url{https://www.nowhere.org/part}}
\chapter[No sharp]{No sharp: \url{https://www.nowhere.org/chapter}}
\section[No sharp]{No sharp: \url{https://www.nowhere.org/section}}
\subsection[No sharp]{No sharp: \url{https://www.nowhere.org/subsection}}
\subsubsection[No sharp]{No sharp: \url{https://www.nowhere.org/subsubsection}}
\paragraph[No sharp]{No sharp: \url{https://www.nowhere.org/paragraph}}
\subparagraph[No sharp]{No sharp: \url{https://www.nowhere.org/subparagraph}}
\part[Not so sharp]{Not so sharp: \myparturl}
\chapter[Not so sharp]{Not so sharp: \mychapterurl}
\section[Not so sharp]{Not so sharp: \mysectionurl}
\subsection[Not so sharp]{Not so sharp: \mysubsectionurl}
\subsubsection[Not so sharp]{Not so sharp: \mysubsubsectionurl}
\paragraph[Not so sharp]{Not so sharp: \myparagraphurl}
\subparagraph[Not so sharp]{Not so sharp: \mysubparagraphurl}
\part[ Sharp]{ Sharp: \url{https://www.nowhere.org/#part}}
\chapter[ Sharp]{ Sharp: \url{https://www.nowhere.org/#chapter}}
\section[ Sharp]{ Sharp: \url{https://www.nowhere.org/#section}}
\subsection[ Sharp]{ Sharp: \url{https://www.nowhere.org/#subsection}}
\subsubsection[ Sharp]{ Sharp: \url{https://www.nowhere.org/#subsubsection}}
\paragraph[ Sharp]{ Sharp: \url{https://www.nowhere.org/#paragraph}}
\subparagraph[ Sharp]{ Sharp: \url{https://www.nowhere.org/#subparagraph}}
\end{document}
答案1
分析\section*
和会比较简单\paragraph*
,但失败的原因与主命令相同。
如果你这样做\section*{x}
,LaTeX 会将其转换为
\@startsection{section}{1}{\z@}{-3.5ex \@plus -1ex \@minus -.2ex}{2.3ex \@plus .2ex}{\normalfont\Large\bfseries}*{x}
它负责一些簿记工作,然后离开
\@ssect{\z@}{-3.5ex \@plus -1ex \@minus -.2ex}{2.3ex \@plus .2ex}{\normalfont\Large\bfseries}{x}
到目前为止,与 并没有太大区别,\paragraph*{x}
我们得到
\@ssect{\z@}{3.25ex \@plus 1ex \@minus .2ex}{-1em}{\normalfont\normalsize\bfseries}{x}
最大的区别在于第三个参数,在 的情况下为正数\section
,在 的情况下为负数\paragraph
。LaTeX 使用正数和负数来决定是显示标题还是内联标题。
定义如下\@ssect
:
% latex.ltx, line 5928:
\def\@ssect#1#2#3#4#5{%
\@tempskipa #3\relax
\ifdim \@tempskipa>\z@
\begingroup
#4{%
\@hangfrom{\hskip #1}%
\interlinepenalty \@M #5\@@par}%
\endgroup
\else
\def\@svsechd{#4{\hskip #1\relax #5}}%
\fi
\@xsect{#3}}
在这种情况下\paragraph*{\url{#}}
,LaTeX 会尝试执行
\def\@svsechd{\normalfont\normalsize\bfseries{\hskip\z@\relax\url{#}}
\section*{\url{#}}
而代码如下
\begingroup
\normalfont\normalsize\bfseries{%
\@hangfrom{\hskip\z@}\interline\@M
\url{#}\@@par}%
\endgroup
相关追踪\section*{\url{#}}
:
\@ssect #1#2#3#4#5->\@tempskipa #3\relax \ifdim \@tempskipa >\z@ \begingroup #4
{\@hangfrom {\hskip #1}\interlinepenalty \@M #5\@@par }\endgroup \else \def \@s
vsechd {#4{\hskip #1\relax #5}}\fi \@xsect {#3}
#1<-\z@
#2<--3.5ex \@plus -1ex \@minus -.2ex
#3<-2.3ex \@plus .2ex
#4<-\normalfont \Large \bfseries
#5<-\url {##}
以及来自\paragraph*{\url{#}}
\@ssect #1#2#3#4#5->\@tempskipa #3\relax \ifdim \@tempskipa >\z@ \begingroup #4
{\@hangfrom {\hskip #1}\interlinepenalty \@M #5\@@par }\endgroup \else \def \@s
vsechd {#4{\hskip #1\relax #5}}\fi \@xsect {#3}
#1<-\z@
#2<-3.25ex \@plus 1ex \@minus .2ex
#3<--1em
#4<-\normalfont \normalsize \bfseries
#5<-\url {##}
! Illegal parameter number in definition of \@svsechd.
<to be read again>
}
l.11 \paragraph*{\url{#}}
?
#
在跟踪信息中是双倍的,但在进行参数替换时又变成了双倍#
。
因此,在这种\section
情况下,\url{#}
被调用来排版某些内容,在这种\paragraph
情况下,它在定义主体中被使用并且被隔离#
会引发错误,因为它在定义中是非法的。
使用更简单的方法会得到同样的错误
\def\x{\url{#}}