我希望使用不带花括号{}
作为分隔符的命令。我更希望命令以换行符作为分隔符。
这是一个不起作用的简单示例(我的已显示但缺少该行)
\documentclass[12pt]{report}
\def\chap #1 {\chapter{#1}}
\def\sec #1 {\section{#1}}
\def\subsec #1 {\subsection{#1}}
\def\li #1 {\begin{itemize}\item #1\end{itemize}}
\begin{document}
\chap My First Chapter
\sec My First Section
\subsec My First Section
\li lkdsjfaljsfad
\li lkdsjfaljsfad
\li lkdsjfaljsfad
\end{document}
你知道怎样让它发挥作用吗?
答案1
这是一个基于 LuaLaTeX 的解决方案。它设置了一个在处理的早期阶段运行的 Lua 函数:它扫描输入的所有行,并简单地用 替换 的实例\chap .....
。\chapter{.....}
(在 Lua 的string.gsub
函数中,$
字符用作行尾标记。)\sec ...
、\subsec ...
和 也是如此\li ...
。通过这种设置,LaTeX 只能“看到”具有标准参数格式的标准宏;无需定义名为\chap
、\sec
等的宏。
% !TeX program = lualatex
\documentclass[12pt]{report}
\usepackage{luacode}
\begin{luacode}
function scan_ahead ( s )
s = string.gsub ( s , "\\chap%s+(.*)$" , "\\chapter{%1}" )
s = string.gsub ( s , "\\sec%s+(.*)$" , "\\section{%1}" )
s = string.gsub ( s , "\\subsec%s+(.*)$" , "\\subsection{%1}" )
s = string.gsub ( s , "\\li%s+(.*)$" , "\\begin{itemize}\\item %1\\end{itemize}")
return s
end
luatexbase.add_to_callback ( "process_input_buffer", scan_ahead , "scan_ahead" )
\end{luacode}
\begin{document}
\chap My First Chapter
\sec My First Section
\li lkdsjfaljsfad
\li abc def ghi
\subsec My First Section
\li jkl mno pqr stu
\end{document}
答案2
我不推荐这样做——它看起来不太好并且破坏了 LaTeX 命令的传统。
egreg
该代码取自在纯 Tex 宏中使用行尾分隔符(当然赞成 ;-))
实际上,这样做并没有任何好处,而且会分散阅读(校对)代码的注意力。
尤其\li
是简短版本,\item
无论如何都不是真正有用的。
行尾字符通常具有 catcode 5,因此\par
在进一步处理输入之前,首先将其转换为空格或标记(取决于状态)。为了识别TeX
行尾,必须将 catcode 更改为12
('other'),在组中,因此使用
\def\chap{\begingroup\catcode`\^^M=12 \xchap}
{\catcode`\^^M=12 %
\gdef\xchap#1^^M{\chapter{#1}\endgroup}%
}
读取内容直到行尾并让临时宏\xchap
显示等(和 也\chapter{...}
一样)。\sec
\subsec
当然,这种方法会破坏\chap[foo]{foo bar}
,即用于章节标题ToC
和页码标题的简短版本不再可用。
\documentclass[12pt]{report}
\def\chap{\begingroup\catcode`\^^M=12 \xchap}
{\catcode`\^^M=12 %
\gdef\xchap#1^^M{\chapter{#1}\endgroup}%
}
\def\sec{\begingroup\catcode`\^^M=12 \xsec}
{\catcode`\^^M=12 %
\gdef\xsec#1^^M{\section{#1}\endgroup}%
}
\def\subsec{\begingroup\catcode`\^^M=12 \xsubsec}
{\catcode`\^^M=12 %
\gdef\xsubsec#1^^M{\subsection{#1}\endgroup}%
}
\begin{document}
\chap My First Chapter
\sec My First Section
\subsec My First Section
\begin{itemize}
\item lkdsjfaljsfad
\item lkdsjfaljsfad
\item lkdsjfaljsfad
\end{itemize}
\end{document}
然而,在我看来,这就是代码高尔夫。