在纯 TeX 中排版 URL/URI/IRI

在纯 TeX 中排版 URL/URI/IRI

我希望能够允许在/?&上换行。

我知道我应该更改这些\catcode字母的 ',但我不希望它们是全局的,而是限制在宏内部。这是我尝试过的:

\def\url{%
  \begingroup%
    \def\urlaux##1{##1\endgroup}%
    \catcode`\&=13
    \def&{\penalty0\char`\&}%
    \urlaux}

\url{http://tex.stackexchange.com/some/long/path/and?someBizarreLong=param&andYetAnotherSuchBizarreLong=param}
\bye

但 TeX 告诉我,在其启动&时无法访问\def

我记得读过这样一段话:“catcode 更改不是在宏执行期间进行的,而是在读取宏期间进行的“, 或类似的规定。

但是我尝试将 & 符号的定义移到 内部\urlaux,但没有成功。

我怎样才能让它可以访问?

答案1

当参数被抓取并标记时,TeX 会分配类别代码。因此,在您的 定义中\url&有 catcode 'tab 对齐'(假设适用正常规则)。您只能使用\def活动字符,因此此步骤会失败,正如您所观察到的。

您需要做的是确保的定义\url包含一个活动的&

\begingroup
\catcode`\&=\active
\gdef\url{%
  \begingroup%
    \def\urlaux##1{##1\endgroup}%
    \catcode`\&=\active
    % Catcode of & that is important here is when \url is defined:
    \def&{\penalty0\char`\&}% 
    \urlaux}
\endgroup

\url{http://tex.stackexchange.com/some/long/path/and?someBizarreLong=param&andYetAnotherSuchBizarreLong=param}
\bye

请注意,您仍然需要更改&抓取时的 catcode争论\urlaux!(这里的整个“技巧”取决于不使用 as 来获取参数,\url因为那样会在错误的时间进行标记。)这意味着重新排序以说

\begingroup
\catcode`\&=\active
\gdef\url{%
  \begingroup%
    % Catcode of & that is important here is when \url is defined:
    \def&{\penalty0\char`\&}% 
    \def\urlaux##1{##1\endgroup}%
    \catcode`\&=\active
    \urlaux}
\endgroup

&也将起作用:第二个 catcode 更改是关于抓取的参数,与我们正在使用的定义无关。

答案2

这好多了不是更改文档中间的 catcodes,而是更改 mathcode(因为这样它即使在宏参数中也能尽可能地工作)这就是 url.sty 所做的

url.sty 几乎不使用任何乳胶,因此只需稍加鼓励就可以使用纯 tex,或者您可以简单地编辑文件以删除乳胶位,而不是像这里一样定义存根

在此处输入图片描述

\catcode`\@=11
\def\@namedef#1{\expandafter\def\csname#1\endcsname}
\def\@ifundefined#1#2#3{%
\expandafter\ifx\csname#1\endcsname\relax
#2\else#3\fi}
\let\protect\relax
\let\ProcessOptions\relax
\def\DeclareOption#1#2{}
\def\@makeother#1{\catcode`#1=12 }
\def\@ifnextchar#1#2#3{#2}
\def\@empty{}
\def\@firstoftwo#1#2{#1}
\def\@secondoftwo#1#2{#2}
\newcount\@tempcnta
\input url.sty
\def\UrlFont{\tt}

\hrule

abc abc \url{http://www.example.com/one/two/three.html}  abc
abc abc \url{http://www.example.com/one/two/three.html}  abc
abc abc \url{http://www.example.com/one/two/three.html}  abc
abc abc \url{http://www.example.com/one/two/three.html}  abc
abc abc \url{http://www.example.com/one/two/three.html}  abc

\bye

答案3

使用eplain

\input eplain
\beginpackages
\usepackage{url}
\endpackages

\rightskip=10em minus 8em % avoid overfull box
\url{http://tex.stackexchange.com/some/long/path/and?someBizarreLong=param&andYetAnotherSuchBizarreLong=param}

\bye

在此处输入图片描述

您的(简单)定义可以用以下方法纠正

\begingroup
\catcode`\&=\active % we want an active & in the replacement text of \url

\gdef\url{% \gdef because we're in a group
  \begingroup
  \def\urlaux##1{##1\endgroup}%
  \catcode`\&=\active
  \def&{\penalty0\char`\&}%
  \urlaux}
\endgroup

\url{http://tex.stackexchange.com/some/long/path/and?someBizarreLong=param&andYetAnotherSuchBizarreLong=param}
\bye

答案4

包裹url也可以通过以下方式与普通 TeX 一起使用miniltx

\input miniltx.tex
\input url.sty
\resetatcatcode

\url{http://tex.stackexchange.com/questions/177340/typesetting-url-uri-iri-in-plain-tex}

\bye

结果

相关内容