我声明了一个新命令来格式化 LaTeX 中的列表元素,如下所示:
\newcommand{\sitem}[1]{\item \makefirstuc{#1},}
\newcommand{\eitem}[1]{\item \makefirstuc{#1}.}
这可以正常工作,但是现在我必须对每个列表元素进行如下支撑:
\begin{itemize}
\sitem{First item}
\eitem{second item}
\end{itemize}
我如何获得它以便实现以下功能?
\begin{itemize}
\sitem First item
\eitem second item
\end{itemize}
答案1
这是一个基于 LuaLaTeX 的解决方案。它设置了一个名为 的 Lua 函数,process_items
充当预处理器:当 TeX 开始处理相关输入行时,它不会“看到” \sitem first item
,而是\item First item,
。(请注意首字母和终止逗号的大写。)Lua 函数分别由 LaTeX 实用程序宏 和 激活和\ItemOn
停用\ItemOff
。
% !TEX TS-program = lualatex
\documentclass{article} % or some other suitable document class
\usepackage{mfirstuc} % for '\makefirstuc' macro
\usepackage{luacode} % for 'luacode' environment
\begin{luacode}
function process_items ( s )
s = string.gsub ( s , '\\sitem%s+(.+)' , '\\item\\makefirstuc{%1},' )
s = string.gsub ( s , '\\eitem%s+(.+)' , '\\item\\makefirstuc{%1}.' )
return s
end
\end{luacode}
\newcommand\ItemOn{\directlua{luatexbase.add_to_callback (
"process_input_buffer", process_items , "ProcessItems" )}}
\newcommand\ItemOff{\directlua{luatexbase.remove_from_callback (
"process_input_buffer", "ProcessItems" )}}
\begin{document}
\ItemOn %% assign the Lua function to the input processor callback
\begin{itemize}
\sitem first item
\sitem second item
\eitem third item
\end{itemize}
\end{document}
答案2
你可以借用\eoldef
OpTeX 中的宏。语法:
\eoldef\macro #1{body of the macro, #1 can be used}
其\macro
参数以行尾分隔来定义。
在你的 LaTeX 文档中它看起来像这样:
\documentclass{article}
\def\eoldef #1{\def #1{\begingroup \catcode`\^^M=12 \eoldefA #1}%
\expandafter\def\csname \string #1:M\endcsname}
{\catcode`\^^M=12 %
\gdef\eoldefA #1#2^^M{\endgroup\csname \string #1:M\endcsname{#2}}%
}
\def\firstupper#1{\uppercase{#1}}
\eoldef\sitem#1{\item \firstupper #1,}
\eoldef\eitem#1{\item \firstupper #1.}
\begin{document}
\begin{itemize}
\sitem First item
\eitem second item
\end{itemize}
\end{document}
答案3
如果您在这种情况下不打算使用嵌套列表,则可以在中实现该作业expl3
。
将输入拆分为\item
并处理结果序列,以便将第一个字母大写。然后传递所有,\item
内容,并在项之间添加一个句号。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentEnvironment{adjitemize}{+b}
{
\adjitemize_main:n { #1 }
}
{}
\seq_new:N \l__adjitemize_in_seq
\seq_new:N \l__adjitemize_out_seq
\cs_new_protected:Nn \adjitemize_main:n
{
% split the body at \item
\seq_set_split:Nnn \l__adjitemize_in_seq { \item } { #1 }
% discard the first item, which is empty
\seq_pop_left:NN \l__adjitemize_in_seq \l_tmpa_seq
% add the capitalization of the first letter
\seq_set_map_x:NNn \l__adjitemize_out_seq \l__adjitemize_in_seq
{
\text_titlecase:n { ##1 }
}
% deliver the result
\begin{itemize}
\item \seq_use:Nn \l__adjitemize_out_seq { , \item } .
\end{itemize}
}
\ExplSyntaxOff
\begin{document}
\begin{adjitemize}
\item first item
with a second line
\item second item
\item final item
\end{adjitemize}
\end{document}
我认为使用比和\item
简单得多,因为您可以移动项目而不必担心哪个是最后一个。唯一要记住的是使用而不是,但这是合理的,因为您想要按摩项目。\sitem
\eitem
adjitemize
itemize