定义使用换行符而不是花括号作为分隔符的新命令

定义使用换行符而不是花括号作为分隔符的新命令

我希望使用不带花括号{}作为分隔符的命令。我更希望命令以换行符作为分隔符。

这是一个不起作用的简单示例(我的已显示但缺少该行)

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

然而,在我看来,这就是代码高尔夫。

相关内容