我希望能够允许在/
、?
和&
上换行。
我知道我应该更改这些\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