编辑:乌尔丽克·菲舍尔给出了正确答案。谢谢,Ulrike。
我接到了一个有趣的项目,涉及为网页创建语法图。由于它们使用大括号和 eqalign 样式的表示,\TeX\ 是显而易见的选择(我使用它xetex
是为了字体灵活性)。为了生成图形,我使用了dvisvgm
,它允许dvips
类似\special
命令。
#
我遇到的问题与术语有关,这些术语是需要链接到网页中的锚点的词,而我在其中创建 URL 时有点疯狂。
我最近的尝试看起来像这样:
\nopagenumbers
\font\termfont="Consolas/I" at 10pt
\def\baseurl{https://someplace.org/dir}
\def\doca{\baseurl/doca.html}
\def\docb{\baseurl/docb.html}
\def\pound{\begingroup\catcode`\#=11\relax #\endgroup}
\def\myterm#1#2#3{%
\hbox{\termfont\special{html:<a href="#1\pound#2">}#3\special{html:</a>}}
}
$$\eqalign{
\myterm{\doca}{anchor1}{thingy1} &= \hbox{description 1}\cr
\myterm{\docb}{anchor2}{thingy2} &= \hbox{description 2}\cr
}$$
\bye
这当然会导致错误:
(./untitled-3.tex
! Illegal parameter number in definition of \pound.
<to be read again>
\endgroup
l.6 ...{\begingroup\catcode`\#=11\relax #\endgroup
}
? _
但我不确定为什么,因为我刚刚改变了 \catcode
是一封信,见鬼。
先前的尝试包括
def\myterm#1#2#3{%
\hbox{\termfont\special{html:<a href="#1###2">}#3\special{html:</a>}}
}
您可能认为在这种情况下它会起作用,但 URL 却显示为(例如)http://someplace.org/dir/doca.html##anchor1
,我不知道为什么。我变得越来越奇怪,尝试了不同的组合\char"23
(只是将这些文字字符放在 URL 中),以各种方式进行更改\catcode
,尝试了各种\expandafter
和\noexpand
和其他组合,我开始怀疑我是否甚至 \TeX\。
我这里遗漏了什么?我现在没有主意了。
答案1
如果您不想与 catcodes 争斗,您可以使用\string
始终产生 catcode 12(或 catcode 10 空间)令牌的。
a
\def\zz#1#2{\special{html:<a href="#1\string###2">}}
\zz{https://example.com}{foo}
b
\bye
处理后xetex --no-pdf
,dviasm
查看 dvi 结构显示
push:
right: 20pt
fnt: cmr10 at 10pt
set: 'a'
pop:
xxx: 'html:<a href="https://example.com#foo">'
down: 12pt
push:
right: 20pt
set: 'b'
pop:
#
URL 中带有单数。
答案2
编辑帖子,确认 Ulrike 的回答。
简而言之,Ulrike 建议进行以下更改:
{\catcode`\#=11\relax \gdef\pound{#}}
\def\myterm#1#2#3{%
\hbox{\ttrm \special{html:<a href="#1\pound#2">}#3\special{html:</a>}}
}
遗憾的是,我完全忘记了\gdef
。但这工作完美且可靠,我对她感激不尽。