定义以“@”开头的命令

定义以“@”开头的命令

语境:我从另一位教员那里继承了一堆乱七八糟的乳胶笔记;这些都是用一个自制的系统处理的,这个系统可以做很多聪明的事情……但这意味着我必须使用办公室的 Linux 系统来处理它们,也意味着查找错误最终成为一个二进制搜索过程,因为聪明的处理会吞噬所有的错误消息并弄乱它们。

事情是这样的:一个典型的文件看起来像这样:

@course{coursehead}
@lec{17}{\textit{(Provisional)} Analysis, Combinatorics}
@cs{coursebegin}
@localnotes{obj}

@localnotes{racket/text/stars-and-stripes}
@localnotes{racket/text/analysis}

其含义(在真正的 LaTeX 中)如下:

\include{../../latex/coursehead}
\title{Lecture 17 \textit{(Provisional)} Analysis, Combinatorics}
\include{../../latex/coursebegin}
\include{obj}

\include{racket/text/stars-and-stripes}
\include{racket/text/analysis}

所以如果我可以只是“define” “@localnotes” 的意思是“\include”,这样我就能够处理笔记的 90% 而不会破坏其他系统的任何内容。

问题: 有没有办法让像“ @localnotes”这样的东西充当 latex 宏?也许同样重要的是:是否确定有决不做到这一点?{如果做不到,我就不想再寻找方法了!}。

我对文本不是很精通。当我看到“makeatletter”时,我知道我即将无法理解接下来的内容。但如果有解决方案以某种方式使用它,我会努力理解它,直到我理解它。

提前致谢。

答案1

给出适当的定义后,只需更改@为与反斜杠相同即可。

TeX 并不关心哪些字符具有类别代码 0,它只是遵循指令。;-)并且,使用哪个类别代码 0 字符来定义宏并不重要。

\documentclass{article}

\newcommand\course[1]{\input{../../latex/#1}}
\newcommand\lec[2]{Lecture #1 #2}
\newcommand\cs[1]{\input{../../latex/#1}}
\newcommand\localnotes[1]{\input{#1}}

\begin{document}

\catcode`@=0

@course{coursehead}
@lec{17}{\textit{(Provisional)} Analysis, Combinatorics}
@cs{coursebegin}
@localnotes{obj}

@localnotes{racket/text/stars-and-stripes}
@localnotes{racket/text/analysis}

\end{document}

document环境中,之后\catcode`@=0,您可以使用@cs或,\cs获得完全相同的结果。

答案2

以下是您可以执行的操作的一个非常简单的实现:

第一名:123;第二名:456

\documentclass{article}

\usepackage{filecontents}
\begin{filecontents*}{inputfile.tex}
@somemacro{123}{456}
\end{filecontents*}

\newcommand{\somemacroprocess}[2]{First: #1; Second: #2}

\begin{document}

\begingroup
\catcode`@=0
\newcommand{@somemacro}{\somemacroprocess}
\input{inputfile}
\endgroup

\end{document}

这个想法就是@通过\改变其类别代码通过

\catcode`@=0

这样你就可以定义一个调用@somemacro的宏与输入文件中的内容相匹配。我创建了一个宏\somemacroprocess来替代@somemacro本地宏(在组内),同时\somemacroprocess以通常的方式定义宏(在组外)。

相关内容