该showexpl
包定义了LTXexample
允许定义乳胶代码并并排显示其结果的环境。问题是它使用与定义乳胶代码相同的文档类,我想定义要使用哪个类作为示例。你知道这是否可能吗?
这里有一个例子。这是一个beamer
包含一些LTXexample
s 的演示文稿。
\documentclass{beamer}
\usepackage{showexpl}
\lstloadlanguages{[LaTeX]Tex}
\lstset{%
basicstyle=\ttfamily\small,
commentstyle=\itshape\ttfamily\small,
showspaces=false,
showstringspaces=false,
breaklines=true,
breakautoindent=true,
captionpos=t
}
\begin{document}
\frame[containsverbatim]{
\frametitle{First slide}
\begin{LTXexample}
\begin{itemize}
\item a
\item b
\item c
\end{itemize}
\end{LTXexample}
\begin{LTXexample}
\begin{equation}
a^2+b^2=\sqrt{\frac{c^2}{1}}
\end{equation}
\end{LTXexample}
}
\frame[containsverbatim]{
\frametitle{Second slide}
\begin{LTXexample}
\documentclass{article}
\begin{document}
\section{Section 1}
Text for section 1
\end{document}
\end{LTXexample}
}
\end{document}
第二张幻灯片没有显示“部分标题”,因为 beamer 有自己的部分行为,所以看起来\documentclass{article}
示例内部没有任何效果。生成的字体是 sanserif,因为 beamer 使用它。
我知道我可以使用几个外部文档并插入代码和结果,但使用LTXexample
或类似的环境会更容易。你知道更好的解决方案吗?
附录:这个问题已经用tcolorbox
而不是sowexpl
来解决托马斯·F·斯特姆在beamer 框架内的文章示例
答案1
代码必须在外部编译。在 beamer 运行中加载 article.cls 和各种包的代码会导致混乱。但理论上,如果 --shell-escape 处于活动状态,则可以在 beamer 运行编译期间动态触发此外部运行,然后使用 showexpl 的图形选项包含生成的 pdf。我看到的主要问题是您可能不想包含完整的页面,而只想包含其中的一部分(例如显示部分)。我认为编写一个好的、灵活的界面来选择这部分会很困难。
答案2
这不是适用于所有情况的“完全可行的”解决方案,但我希望答案足以展示如何以合理灵活的方式完成任务。代码showexpl
很长,因此分解它以添加使用外部编译的能力有点棘手。相反,我使用了一些我从自己的软件包中的源代码改编的代码,并添加了额外的功能。因此,您无法获得开箱即用listings
的所有功能,尽管您可以添加它们:showexpl
\documentclass{beamer}
\usepackage{ifplatform}
\usepackage{listings}
\makeatletter
\lst@RequireAspects{writefile}
\newbox\LaTeXdemo@box
\newbox\LaTeXdemo@graphics
\lstnewenvironment{LaTeXdemo}[1][code-and-example]{%
\global\let\lst@intname\@empty
\ifcsname LaTeXdemo@#1@end\endcsname
\expandafter\let\expandafter\LaTeXdemo@end
\csname LaTeXdemo@#1@end\endcsname
\csname LaTeXdemo@#1\expandafter\endcsname
\else
\ERROR
\fi
}{%
\LaTeXdemo@end
}
\newcommand*{\LaTeXdemo@common}{%
\setkeys{lst}{%
basewidth = 0.51 em,
basicstyle = \small\ttfamily ,
gobble = 2,
keywordstyle = \color{blue},
language = [LaTeX]{TeX},
moretexcs =
{
% Add list of additions here, e.g.
email
}
}%
}
\newcommand*{\LaTeXdemo@input}{%
\catcode`\^^M=10\relax
\small
\begingroup
\leavevmode
\input{\jobname.tmp}%
\endgroup
}
\@namedef{LaTeXdemo@code-and-example}{%
\setbox\LaTeXdemo@box=\hbox\bgroup
\lst@BeginAlsoWriteFile{\jobname.tmp}%
\LaTeXdemo@common
}
\@namedef{LaTeXdemo@code-and-example@end}{%
\lst@EndWriteFile
\egroup
\begin{center}
\ifdim\wd\LaTeXdemo@box>0.48\linewidth\relax
\hbox to\linewidth{\box\LaTeXdemo@box\hss}%
\begin{minipage}{\linewidth}
\LaTeXdemo@input
\end{minipage}
\else
\begin{minipage}{0.48\linewidth}
\LaTeXdemo@input
\end{minipage}
\hfill
\begin{minipage}{0.48\linewidth}
\hbox to\linewidth{\box\LaTeXdemo@box\hss}%
\end{minipage}
\fi
\end{center}
}
\expandafter\let\csname LaTeXdemo@code-and-external\expandafter\endcsname
\csname LaTeXdemo@code-and-example\endcsname
\@namedef{LaTeXdemo@code-and-external@end}{%
\lst@EndWriteFile
\egroup
\immediate\write18{pdflatex -jobname \jobname-demo
"\unexpanded\expandafter{\LaTeXdemo@documentclass@move}
\noexpand\input \jobname.tmp"}%
\begin{center}
\ifdim\wd\LaTeXdemo@box>0.48\linewidth\relax
\hbox to\linewidth{\box\LaTeXdemo@box\hss}%
\begin{minipage}{\linewidth}
\includegraphics{\jobname-demo}%
\end{minipage}
\else
\begin{minipage}{0.48\linewidth}
\includegraphics{\jobname-demo}%
\end{minipage}
\hfill
\begin{minipage}{0.48\linewidth}
\hbox to\linewidth{\box\LaTeXdemo@box\hss}%
\end{minipage}
\fi
\end{center}
\immediate\write18{\ifwindows del\else rm\fi \jobname-demo.pdf}%
}
\begingroup
\catcode`\#=12 %
\gdef\LaTeXdemo@documentclass@move{%
\let\LaTeXdemodocumentclass\documentclass
\renewcommand{\documentclass}[2][]{%
\let\documentclass\LaTeXdemodocumentclass
\begingroup
\edef\x{%
\endgroup
\noexpand\documentclass[class=#2,varwidth,#1]{standalone}%
}%
\x
}%
}
\endgroup
\makeatother
\begin{document}
\begin{frame}[fragile]
\frametitle{An example in the beamer class}
\begin{LaTeXdemo}
\section{foobar}
\begin{itemize}
\item foo
\item bar
\end{itemize}
\end{LaTeXdemo}
\end{frame}
\begin{frame}[fragile]
\frametitle{An example in the article class}
\begin{LaTeXdemo}[code-and-external]
\documentclass{article}
\begin{document}
\section{foobar}
\begin{itemize}
\item foo
\item bar
\end{itemize}
\end{document}
\end{LaTeXdemo}
\end{frame}
\end{document}
上面的想法是提供不同的打印示例方式:我只包含了“代码加演示”和“代码加外部编译的演示”,但“仅代码”和“代码加浮动演示”很容易做到:如果有兴趣,我可以添加。(如果真的想要,我猜还有“代码加浮动外部编译的演示”!)就目前而言,代码假设目标是“并排”演示,但如果不合适,则不进行缩放,而是将输出放在代码下方。这可以轻松调整,但也许最好作为一个单独的(链接的)问题。
棘手的部分是使用外部编译(假设这是必需的)获得围绕输出的“紧密”页面。我使用的方法是真正使用类standalone
,但在辅助编译中使用一些技巧将“必需”类作为参数传递给该类。
请注意,其中一些内容有点低级(例如框内容),而其中一些内容可以“移至更高层”。还请注意,至少需要限制\write18
,并且我没有添加多通道、BibTeX 或类似支持,但这可以通过一点努力来实现(可能对可选参数使用键值方法)。