语境:我从另一位教员那里继承了一堆乱七八糟的乳胶笔记;这些都是用一个自制的系统处理的,这个系统可以做很多聪明的事情……但这意味着我必须使用办公室的 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
以通常的方式定义宏(在组外)。