我定义了以下宏:
\begingroup
\lccode`\~=`\#%
\lowercase{\endgroup%
\def~ #1\par}{%
\begingroup\def\par{\endgroup\par}%
\section*{#1}\par}%
\catcode`\#=13
但如果我继续定义一个命令,例如
\begingroup
\lccode`\~=`\#%
\lowercase{\endgroup%
\def~~ #1\par}{%
\begingroup\def\par{\endgroup\par}%
\subsection*{#1}\par}%
\catcode`\#=13
虽然## Test
现在可以按预期工作,但是的任何使用# Test
都不再起作用,并且控制台返回一个错误,指出Use of # doesn't match its definition.
。
我如何配置这种类型的宏以便两个宏都能按预期工作?
答案1
当\def
后面跟着一个活动字符时,表示已定义,并且直到开括号之后的所有内容都是宏的参数文本。
使用代码的第一部分,您可以为活动#
和\show#
打印赋予含义
> #=macro:
#1\par ->\begingroup \def \par {\endgroup \par }\section *{#1}\par .
参数文本为
#1\par
这意味着直到第一个后续\par
标记为止的所有内容都将成为参数。
当你执行第二段代码时(当然需要延迟\catcode
#=13 ), you're overriding the meaning of the active
# ; indeed,
\show#` 现在打印
> #=macro:
# #1\par ->\begingroup \def \par {\endgroup \par }\subsection *{#1}\par .
现在#
是一个宏(活动字符),预计后面会跟着另一个活动的#
。因此# Text
会引发错误
Use of # doesn't match its definition.
您需要定义活动#
来查看以下标记是否是另一个标记#
,并且在这种情况下采取适当的操作。
这是一个可能的定义
\documentclass{article}
\makeatletter
\begingroup\lccode`~=`#
\lowercase{\endgroup
\def~{\@ifnextchar~\markdown@subsec\markdown@sec}
}
\def\markdown@sec#1\par{\section*{#1}}
\def\markdown@subsec#1{\@ifnextchar\valign\relax\markdown@subsec@aux}
\def\markdown@subsec@aux#1\par{\subsection*{#1}}
\makeatother
\AtBeginDocument{\catcode`\#=\active}
\begin{document}
# Section Title
Some text
## Subsection Title
Some other text
\end{document}
的神秘定义\markdown@subsec
是由于需要占用空间而解释的:\@ifnextchar
这样做是因为编写起来相当困难##\valign
;如果这样做,宏就会失败。
小节的扩展很简单:
\documentclass{article}
\makeatletter
\begingroup\lccode`~=`#
\lowercase{\endgroup
\def~{\@ifnextchar~\markdown@subsec\markdown@sec}
\def\markdown@subsec#1{\@ifnextchar~\markdown@subsubsec\markdown@subsec@aux}
}
\def\markdown@sec#1\par{\section*{#1}}
\def\markdown@subsubsec#1{\@ifnextchar\valign\relax\markdown@subsubsec@aux}
\def\markdown@subsec@aux#1\par{\subsection*{#1}}
\def\markdown@subsubsec@aux#1\par{\subsubsection*{#1}}
\makeatother
\AtBeginDocument{\catcode`\#=\active}
\begin{document}
# Section Title
Some text
## Subsection Title
Some other text
### Subsubsection Title
Oh, well!
\end{document}