![如何在不知道其原始定义的情况下修改 Beamer 上的环境](https://linux22.com/image/320316/%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%8D%E7%9F%A5%E9%81%93%E5%85%B6%E5%8E%9F%E5%A7%8B%E5%AE%9A%E4%B9%89%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E4%BF%AE%E6%94%B9%20Beamer%20%E4%B8%8A%E7%9A%84%E7%8E%AF%E5%A2%83.png)
以下是 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}
我想修改frame
、itemize
和column
环境以将\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\textwidth
process_input_buffer
,回调在处理的早期阶段运行,具体来说,前TeX 进行任何“常规”处理。
这种方法的优点是环境frame
、itemize
和column
实际上没有以任何方式被修改。因此,首先也没有必要知道这些环境是如何定义的。
% !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}
就我个人而言,我认为这不是一个好主意。