Проверка того, находится ли содержимое \item's среды \list полностью в режиме встроенной математики

Проверка того, находится ли содержимое \item's среды \list полностью в режиме встроенной математики

У меня есть список

\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, и gsubstring.

Также есть два служебных макроса LaTeX, называемых \DisplayOnи \DisplayOff, которые активируют и деактивируют switch2displaystyleфункцию. Под «активацией» я подразумеваю назначение обратному вызову switch2displaystyleLuaTeX 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}

Связанный контент