如何使 newcommand 将我的其余行作为参数?

如何使 newcommand 将我的其余行作为参数?

我声明了一个新命令来格式化 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

你可以借用\eoldefOpTeX 中的宏。语法:

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

在此处输入图片描述

相关内容