检查 \list 环境的 \item 的内容是否完全处于内联数学模式

检查 \list 环境的 \item 的内容是否完全处于内联数学模式

我有一个清单

\begin{list}{}{}
    \item[(1)] First things first.
    \item[(2)] There are \(1 + 1 = 2\) types of "normal" math
        \[e^{2\pi i} + 1 = 2\]
    \item[(3)] Third time's \(\frac{1}{3}\) of a charm.
    \item[(4)] \(f(x) = 4\)
\end{list}

我只想将以下命令应用于(4):

\newcommand{\displayit}[1]{\bgroup\allmath{\displaystyle}#1\egroup}

这里的条件是,(4) 唯一发生的情况是它包含内联数学材料——而没有其他内容(除了指令之外\item)。相比之下,(1) 不包含任何数学;(2) 同时包含内联和显示数学,并且“真正的”内联数学材料位于句子中间;(3) 与 (2) 的情况类似,在句子中间有“真正的”内联数学。

我不能直接将 (2) 改为这样,\[1 + 1 = 2\]因为这样会产生不良的格式(例如,等式周围会出现更多的空白)。

答案1

前面的一个评论:我建议您加载包并输入,而不是使用非常低级的list环境,然后必须手动编辑每个标签的外观——不再手动编辑每个指令的输出。\itemenumitem\begin{enumerate}[label=(\arabic*)] ... \end{enumerate}\item

虽然 OP 表示不想使用 LuaLaTeX,但这篇文章的其他读者可能会发现,看到基于 LuaLaTeX 的解决方案在实际应用中会很有启发。希望以下输入格式要求不具约束力:

  • \begin{enumerate},,\item并且\end{enumerate}永远不会发生一起在输入行中;
  • \item每个输入行最多有一个指令;
  • 每行输入中最多有一个内联数学材料实例;并且
  • \(\)用于启动和终止内联数学模式。

解决方案的工作原理如下:一个名为 的 Lua 函数switch2displaystyle对每一行输入进行操作;如果它在环境中enumerate,它会检查输入行是否由\item(可选) 和纯内联数学材料(即无文本)组成。如果满足此条件,则\displaystyle在 后插入一个指令\(。该switch2displaystyle函数使用 Lua 的findsubgsub字符串函数。

还有两个实用的 LaTeX 宏,称为\DisplayOn\DisplayOff,用于激活和停用该switch2displaystyle函数。我所说的“激活”是指将 分配switch2displaystyle给 LuaTeX 的process_input_buffer回调,其中该函数作为输入流的预处理器运行。


在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{enumitem}
\usepackage{luacode} % for 'luacode' envenvironment

\begin{luacode}
in_list_env = false -- initiate a Boolean flag
function switch2displaystyle ( s ) 
  if s:find ( "\\begin{enumerate}" ) then
    in_list_env = true
  elseif s:find ( "\\end{enumerate}" ) then
    in_list_env = false
  elseif in_list_env == true then -- there's something to do
    if s:find ( "\\item" ) then
      s = s:gsub ( "^%s-\\item%s-(\\%(.-\\%))$" , 
                   function ( x )
                      return "\\item \\( \\displaystyle " .. x:sub(3) 
                   end ) 
    else
      s = s:gsub ( "^%s-(\\%(.-\\%))$" , 
                   function ( x )
                      return "\\( \\displaystyle " .. x:sub(3)
                   end )
    end
    return s
  end
end
\end{luacode}

% Define 2 LaTeX utility macros
\newcommand\DisplayOn{\directlua{%
   luatexbase.add_to_callback(
     "process_input_buffer" , switch2displaystyle , 
     "switchtodisplaystyle" )}}
\newcommand\DisplayOff{\directlua{%
   luatexbase.remove_from_callback(
     "process_input_buffer" , 
     "switchtodisplaystyle" )}}

\begin{document}

\DisplayOn % activate the Lua function

% Verify that nothing happens if we're not in an 'enumerate' env.
\( \frac{1}{2}+\frac{1}{2}=1 \)

\begin{enumerate}[label=(\arabic*)]
\item First things first.
\item There are \( \frac{2}{2}+\frac{3}{3}=2 \) types of ``normal'' math
      \[ \textstyle \frac{1}{2}+\frac{1}{2}=1 \]
\item Third time's \( \frac{1}{2}+\frac{1}{2}=1 \) not a charm.
\item \( \frac{1}{2}+\frac{1}{2}=1 \)
     
      \( \frac{1}{4}+\frac{1}{4}=\frac{1}{2} \)
     
\DisplayOff % deactivate the Lua function

      \(\frac{1}{2}+\frac{1}{2}=1\)
\end{enumerate}

\end{document}

相关内容