如何将 showexpl 与外部类一起使用?

如何将 showexpl 与外部类一起使用?

showexpl包定义了LTXexample允许定义乳胶代码并并排显示其结果的环境。问题是它使用与定义乳胶代码相同的文档类,我想定义要使用哪个类作为示例。你知道这是否可能吗?

这里有一个例子。这是一个beamer包含一些LTXexamples 的演示文稿。

\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 或类似支持,但这可以通过一点努力来实现(可能对可选参数使用键值方法)。

相关内容