Überprüfen, ob der Inhalt der \items einer \list-Umgebung vollständig im Inline-Mathematikmodus vorliegt

Überprüfen, ob der Inhalt der \items einer \list-Umgebung vollständig im Inline-Mathematikmodus vorliegt

Ich habe eine Liste

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

Ich möchte den folgenden Befehl nur auf (4) anwenden:

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

Die Bedingung hier ist, dass das einzige, was mit (4) passiert, ist, dass es Inline-Mathematikmaterial enthält – und sonst nichts (außer der \itemDirektive). Im Gegensatz dazu enthält (1) keine Mathematik; (2) enthält sowohl Inline- als auch Anzeigemathematik, und das „echte“ Inline-Mathematikmaterial befindet sich in der Mitte eines Satzes; und (3) befindet sich in einer ähnlichen Situation wie (2) mit „echter“ Inline-Mathematik in der Mitte eines Satzes.

Ich kann (2) nicht einfach in „(2)“ umwandeln, \[1 + 1 = 2\]weil das zu einer unerwünschten Formatierung führt (beispielsweise zu viel mehr Leerraum um die Gleichung herum).

Antwort1

Ein Kommentar vorweg: Anstatt eine listUmgebung auf sehr niedriger Ebene zu verwenden und dann das Erscheinungsbild jedes einzelnen \itemEtiketts manuell bearbeiten zu müssen, schlage ich vor, dass Sie das enumitemPaket laden und eingeben \begin{enumerate}[label=(\arabic*)] ... \end{enumerate}– kein manuelles Bearbeiten der Ausgabe jeder einzelnen \itemAnweisung mehr.

Obwohl der OP angegeben hat, LuaLaTeX nicht verwenden zu wollen, finden es andere Leser dieses Beitrags vielleicht aufschlussreich, eine LuaLaTeX-basierte Lösung in Aktion zu sehen. Die folgenden Anforderungen an das Eingabeformat sind hoffentlich nicht bindend:

  • \begin{enumerate}, \item, und \end{enumerate}treten nie aufzusammenin einer Eingabezeile;
  • es gibt höchstens eine \itemAnweisung pro Eingabezeile;
  • Es gibt höchstens eine Instanz von Inline-Mathematikmaterial in einer Eingabezeile; und
  • \(und \)werden zum Starten und Beenden des Inline-Mathematikmodus verwendet.

Die Lösung funktioniert folgendermaßen: Eine Lua-Funktion namens switch2displaystylebearbeitet jede Eingabezeile. Wenn sie sich in einer enumerateUmgebung befindet, prüft sie, ob die Eingabezeile aus \item(optional) und reinem Inline-Mathematikmaterial besteht (also keinen Text). Wenn diese Bedingung erfüllt ist, \displaystylewird nach eine Direktive eingefügt \(. Die switch2displaystyleFunktion verwendet Luas find, sub, und gsubString-Funktionen.

Es gibt auch zwei LaTeX-Dienstprogrammmakros namens \DisplayOnund \DisplayOff, die die Funktion aktivieren und deaktivieren switch2displaystyle. Mit „Aktivierung“ meine ich die Zuweisung von switch2displaystylean den LuaTeX- process_input_bufferCallback, wo die Funktion als Präprozessor auf dem Eingabestrom arbeitet.


Bildbeschreibung hier eingeben

% !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}

verwandte Informationen