\url{...} 中的尖锐字符:允许在所有分段命令中使用,但(子)段落除外

\url{...} 中的尖锐字符:允许在所有分段命令中使用,但(子)段落除外

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{#}}

相关内容