\special、html:URL 和磅号问题

\special、html:URL 和磅号问题

编辑:乌尔丽克·菲舍尔给出了正确答案。谢谢,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-pdfdviasm查看 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。但这工作完美且可靠,我对她感激不尽。

相关内容