我有一个清单
\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
环境,然后必须手动编辑每个标签的外观——不再手动编辑每个指令的输出。\item
enumitem
\begin{enumerate}[label=(\arabic*)] ... \end{enumerate}
\item
虽然 OP 表示不想使用 LuaLaTeX,但这篇文章的其他读者可能会发现,看到基于 LuaLaTeX 的解决方案在实际应用中会很有启发。希望以下输入格式要求不具约束力:
\begin{enumerate}
,,\item
并且\end{enumerate}
永远不会发生一起在输入行中;\item
每个输入行最多有一个指令;- 每行输入中最多有一个内联数学材料实例;并且
\(
并\)
用于启动和终止内联数学模式。
解决方案的工作原理如下:一个名为 的 Lua 函数switch2displaystyle
对每一行输入进行操作;如果它在环境中enumerate
,它会检查输入行是否由\item
(可选) 和纯内联数学材料(即无文本)组成。如果满足此条件,则\displaystyle
在 后插入一个指令\(
。该switch2displaystyle
函数使用 Lua 的find
、sub
和gsub
字符串函数。
还有两个实用的 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}