定义一个宏,其语法包含另一个宏的语法

定义一个宏,其语法包含另一个宏的语法

我定义了以下宏:

\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}

在此处输入图片描述

相关内容