У меня есть список
\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
string.
Также есть два служебных макроса 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}