如何在不知道其原始定义的情况下修改 Beamer 上的环境

如何在不知道其原始定义的情况下修改 Beamer 上的环境

我的问题类似于我也尝试过,但对我不起作用。

以下是 MWE:

\documentclass{beamer}
\usepackage{ragged2e}
\usepackage{lipsum}
\begin{document}
\footnotesize
\begin{frame}\justifying
    \lipsum[11]
    \begin{columns}
        \begin{column}{0.5\columnwidth}
            \begin{itemize}\justifying
                \item \lipsum[11]
            \end{itemize}
        \end{column}
        \begin{column}{0.5\columnwidth}\justifying
            \lipsum[11]
        \end{column}
    \end{columns}
\end{frame}
\end{document}

我想修改frameitemizecolumn环境以将\justifying命令附加到它们。

我不想创建新的环境。

欢迎任何建议!

答案1

\xapptocmd代码附加到其他命令(在某些情况下),以及环境启动命令\frame等。

但是,为了使这段代码真正起作用,最好知道定义是怎样的。\xapptocmd适用于\begin{frame},但不适用于等,并且由于可选参数,\begin{frame}[options]{Foo}它不适用于。\begin{column}

为了抓住这一点,我决定使用xparse\RenewDocumentEnvironment,注入\justifying\AtBeginEnvironment使用etoolbox

\documentclass{beamer}
\usepackage{ragged2e}
\usepackage{lipsum}
\usepackage{xpatch}
\usepackage{xparse}
\usepackage{letltxmacro}

\xapptocmd{\frame}{\justifying}{\typeout{Success}}{\typeout{Failure}}
\xapptocmd{\itemize}{\justifying}{\typeout{Success}}{\typeout{Failure}} % Useful???

\LetLtxMacro\origcolumn\column
\LetLtxMacro\origcolumnend\endcolumn

\RenewDocumentEnvironment{column}{O{}g}{%
  \IfValueTF{#2}{%
    \origcolumn[#1]{#2}%
  }{%
    \origcolumn[#1]%
  }%    
  \justifying%
}{%
  \origcolumnend%
}


\begin{document}
\footnotesize
\begin{frame}%\justifying
    \lipsum[11]
    \begin{columns}
        \begin{column}{0.5\columnwidth}
            \begin{itemize}
            \item \lipsum[11]
            \end{itemize}
        \end{column}
        \begin{column}{0.5\columnwidth}
            \lipsum[11]
        \end{column}
    \end{columns}
\end{frame}
\end{document}

答案2

这是一个基于 LuaLaTeX 的解决方案,它定义了一个 Lua 函数,用于附加到、和\justifying的所有实例,其中是任意的(但可能是)。该函数由\begin{frame}\begin{itemize}\begin{column}{...}...0.5\textwidthprocess_input_buffer,回调在处理的早期阶段运行,具体来说,TeX 进行任何“常规”处理。

这种方法的优点是环境frameitemizecolumn实际上没有以任何方式被修改。因此,首先也没有必要知道这些环境是如何定义的。

% !TEX TS-program = lualatex
\documentclass{beamer}
\usepackage{ragged2e} % for "\justifying" macro
\usepackage{lipsum}

\usepackage{luacode}
\begin{luacode}
function add_justifying ( line )
   line = string.gsub ( line, "\\begin{frame}",      "%0\\justifying" )
   line = string.gsub ( line, "\\begin{itemize}",    "%0\\justifying" )
   line = string.gsub ( line, "\\begin{column}{.-}", "%0\\justifying" )
   return line
end
luatexbase.add_to_callback ( "process_input_buffer" , add_justifying, "add_justifying" )
\end{luacode}

\begin{document}
\footnotesize
\begin{frame}
    \lipsum[11]
    \begin{columns}
        \begin{column}{0.5\columnwidth}
            \begin{itemize}
                \item \lipsum[11]
            \end{itemize}
        \end{column}
        \begin{column}{0.5\columnwidth}
            \lipsum[11]
        \end{column}
    \end{columns}
\end{frame}
\end{document}

答案3

如果您的目的是让所有事情都合理,请重新定义\raggedright为什么都不做,并保留一份副本以备不时之需。

\documentclass{beamer}
\usepackage{ragged2e}
\usepackage{lipsum}

\let\latexraggedright\raggedright % just in case
\let\raggedright\relax
\justifying % because beamer.cls issues \raggedright

\begin{document}
\footnotesize
\begin{frame}

\lipsum[11]

\begin{columns}
\begin{column}{0.5\columnwidth}

\begin{itemize}
\item \lipsum[11]
\end{itemize}

\end{column}
\begin{column}{0.5\columnwidth}
\lipsum[11]
\end{column}

\end{columns}
\end{frame}

\end{document}

在此处输入图片描述

就我个人而言,我认为这不是一个好主意。

相关内容