我正在尝试定义一个在\AtBeginDocument
命令中使用两个活动字符的宏。
我可以仅使用一个活动字符编写如下宏:
\catcode`\_=13
\begingroup
\lccode`\~=`\_
\lowercase{\endgroup
\def~#1~}{\emph{#1}}
\def\_{\char"5F\relax}
不过,我想将两个字符定义为活动字符,并同时使用它们来包含简写语法。
如果我使用类似以下的代码:
\catcode`\<=13
\catcode`\>=13
\begingroup
\lccode`\~=`\<
\lowercase{\endgroup
\def~#1>}{\url{#1}}
\def\<{\char"3C\relax}
\def\>{\char"3E\relax}
控制台返回Paragraph ended before < was complete
。
看起来这两个字符都需要以类似于将它们定义为波浪号的小写版本的间接方式使用。
在这种情况下,我可以使用其他角色来使此类宏起作用吗?或者有更好的方法吗?
答案1
如果您要定义以下形式的 URL 简写<my URL>
,则可执行以下操作:
\documentclass{article}
\usepackage{url}% http://ctan.org/pkg/url
% Create <URL> shorthand
\catcode`\<=13%
\begingroup
\lccode`\~=`\<
\lowercase{\endgroup
\def~#1>}{\url{#1}}
\begin{document}
Check out <http://tex.stackexchange.com> for more information.
\end{document}
之所以有效,是因为您只是>
在参数规范中将 - 用作分隔符<
- 现在是活动字符。它本身不需要处于活动状态。
<
请注意,当您在数学模式下使用时,这会导致问题。
答案2
我不明白为什么<http://a.b.c>
优于\url{http://a.b.c}
,也不明白 为何_xyz_
比 更清楚\emph{xyz}
。我相信在两种情况下,后者的语法都更好。
不过,这里有一个可以解决您的问题的方法。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{hyperref}
\begingroup\lccode`\~=`\_ \lowercase{\endgroup
\protected\def~{\ifmmode\sb\else\expandafter\abbrvemph\fi}
\def\abbrvemph#1~{\emph{#1}}
\begingroup\lccode`~=`< \lowercase{\endgroup
\protected\def~}{\ifmmode<\else\expandafter\abbrvurl\fi}}
\def\abbrvurl#1>{\url{#1}}
\AtBeginDocument{
\catcode`<=\active
\catcode`_=\active
}
\begin{document}
This is a URL: <http://a.b.c> and this _is_ emphasized,
but in formulas like $a<b_{1}$ there is _no_ prob\_lem.
\end{document}
请注意,无需定义\_
;也不需要破坏\<
或\>
,因为<
在数学模式下可以正常工作,对于_
答案3
请注意,任何活动角色都没有什么特别之处~
。另外,从你的问题中无法清楚看出你为什么需要间接访问\lowercase
。
\catcode`\<=13
\catcode`\>=13
\begingroup
\lccode`\~=`\<
\lowercase{\endgroup
\def~#1>}{\url{#1}}
\def\<{\char"3C\relax}
\def\>{\char"3E\relax}
是相同的
\catcode`\<=13
\catcode`\>=13
\def<#1>{\url{#1}}
\def\<{\char"3C\relax}
\def\>{\char"3E\relax}
\lowercase
如果您需要同时使用非活动和活动令牌,则只需使用此技巧。例如,您\char
在这里使用了,但在第一个版本中,您可以将激活延迟<
到定义之后,然后写入
\def\<{<}
或者类似
\def~{<}
定义一个活动的 < 来扩展为非活动的 <。
例如,下面生成的日志为
A: the character <
B: macro:#1>->\url {#1}
来自文件
\documentclass{article}
\usepackage{url}
\begingroup
\catcode`\<=13
\catcode`\>=13
\AtBeginDocument{%
\catcode`\<=13 %
\catcode`\>=13 %
\def<#1>{\url{#1}}%
\def\<{\char"3C\relax}%
\def\>{\char"3E\relax}%
}
\endgroup
\typeout{A: \meaning<}
\begin{document}
\typeout{B: \meaning<}
<http://example.org>
\end{document}