使用自定义 LaTeX 环境进行示例演示

使用自定义 LaTeX 环境进行示例演示

我正在写一篇关于 LaTeX 用法的(较长的)文章,我想将一些 LaTeX 源代码与其结果一起排版——但我不确定如何实现它。

我知道这个问题但是,它只列出了几种替代方案。我感兴趣的更像是比较。我特别感兴趣的是以下特征(或缺乏特征):

  1. 语法高亮的可能性。

  2. 依赖外部工具(例如 Perl/Python 脚本)和/或\write18

  3. 定制布局的可能性/简易性。

  4. 可以排版代码片段和/或完整文档(\documentclass等等)。

  5. 速度(我会有相当多的 LaTeX 代码片段,甚至可能超过一百个,而且我通常在一台速度很慢的上网本上工作)。我认为实现我想要的目标的唯一方法是通过写入外部文件,这很慢;另一方面,我很确定 LuaTeX 可以在没有这些文件的情况下使用——但 LuaTeX 也不是很快……)

  6. 依赖于特定的 TeX 引擎(例如 LuaTeX)。

没有功能(或缺少功能)对我来说不是什么大问题(也许除了自定义布局的可能性 - 例如,代码和结果的水平或垂直对齐,sverb不是我最喜欢的选择),所以即使一个包没有特定的功能,我们也欢迎你把它包括进去。

为了完整性,也欢迎 ConTeXt 解决方案。

我建议每个答案一个包。

答案1

在我的软件包手册中,我使用了一个自定义软件包来编写代码和示例,它结合了listingsmdframed用于显示代码。我并没有真正打算将其公开(这就是为什么它有很多怪癖,应该在某个时候解决...)但它在 CTAN 上可用。但是:使用风险自负!

\documentclass{article}
\usepackage[example]{cnltx}
\begin{document}

\begin{example}
  This is a piece of \LaTeX\ code.
\end{example}

\begin{example}[code-only]
  This is a piece of \LaTeX\ code.
\end{example}

\begin{example}[side-by-side]
  This is a piece of \LaTeX\ code.
\end{example}

\begin{example}[side-by-side,code-left=false]
  This is a piece of \LaTeX\ code.
\end{example}

\end{document}

在此处输入图片描述

listings默认使用名为 的自定义样式cnltx。但可以自定义。以下示例覆盖样式cnltx。还有选项可以修改它,而不是重新定义它。默认样式知道语言是 TeX 还是 LaTeX,还知道许多 (La)TeX 宏名称和环境名称。它的布局取决于可以更改的配色方案。这意味着也可以使用cnltx具有不同颜色的样式

\documentclass{article}
\usepackage[example]{cnltx}
\lstdefinestyle{mystyle}{
  language   = [AlLaTeX]TeX,
  basicstyle = {\ttfamily\small},
  columns    = fullflexible ,
  texcsstyle = \color{blue},
}
\setcnltx{
  listings-options = {style=mystyle} ,
  frame-options = ,
  code-sep = \dotfill
}
\begin{document}

\begin{example}
  This is a piece of \LaTeX\ code.
\end{example}

\begin{example}[code-only]
  This is a piece of \LaTeX\ code.
\end{example}

\begin{example}[side-by-side]
  This is a piece of \LaTeX\ code.
\end{example}

\begin{example}[side-by-side,code-left=false]
  This is a piece of \LaTeX\ code.
\end{example}

\end{document}

在此处输入图片描述

也可以显示完整的文档。这意味着必须启用 shell-escape – 至少运行一次才能生成包含的 PDF。

% arara: pdflatex: { shell: on }
\documentclass{article}
\usepackage[example]{cnltx}
\setcnltx{
  add-cmds = lipsum
}
\begin{document}

\begin{example}[compile]
  \documentclass{article}
  \usepackage{lipsum}
  \begin{document}
  \lipsum
  \end{document}
\end{example}

\end{document}

在此处输入图片描述

再次强调,有多种选择可以影响行为。

% arara: pdflatex: { shell: on }
\documentclass{article}
\usepackage[example]{cnltx}
\setcnltx{
  add-cmds = lipsum
}
\begin{document}

\begin{example}[compile,program=lualatex,runs=1,pages=1,
  graphics={trim={5cm 18cm 5cm 7cm},clip}]
  \documentclass{article}
  \usepackage{lipsum}
  \begin{document}
  \lipsum
  \end{document}
\end{example}

\end{document}

在此处输入图片描述

该包具有相当多的进一步的功能,如宏\cs{cs name},,\env{env name}...(这些宏使用与列表样式相同的颜色方案cnltx),它支持宏和环境名称的索引等等。

答案2

在尝试了几乎所有可用的软件包之后,我编写了自己的宏。它使用列表里面彩色盒子突出显示源代码:

\documentclass{article}
\usepackage{currfile}
\usepackage{tcolorbox}
\tcbuselibrary{listings}
\begin{document}
\newcount\LTGbeginlineexample
\newcount\LTGendlineexample
\newenvironment{ltgexample}%
{\LTGbeginlineexample=\numexpr\inputlineno+1\relax}%
{%
\LTGendlineexample=\numexpr\inputlineno-1\relax%

\tcbinputlisting{%
  listing only,
  listing file=\currfilepath,
  colback=green!5!white,
  colframe=green!25,
  coltitle=black!90,
  coltext=black!90,
  left=8mm,
  title=Corresponding \LaTeX{} code of \texttt{\currfilepath},
  listing options={%
    language={[LaTeX]TeX},
    firstline=\the\LTGbeginlineexample,
    lastline=\the\LTGendlineexample,
    firstnumber=\the\LTGbeginlineexample,
    basewidth=.5em,
    aboveskip=0mm,
    belowskip=0mm,
    numbers=left,
    xleftmargin=0mm,
    numberstyle=\tiny,
    numbersep=8pt%
  }
}
}%

\begin{ltgexample}
This text demonstrates \LaTeX.
\end{ltgexample}

\end{document}

截屏

  • 语法高亮的可能性:是
  • 对外部工具(例如 Perl/Python 脚本)和/或 \write18 的依赖:无
  • 自定义布局的可能性/难易程度:完全可定制(取决于您的个人 LaTeX 技能)
  • 可以排版代码片段和/或完整文档(使用 \documentclass 等):仅限片段
  • 速度(我会有相当多的 LaTeX 代码片段,甚至可能超过一百个,而且我通常在一台速度很慢的上网本上工作)。我认为实现我想要的东西的唯一方法是通过写入外部文件,这很慢;另一方面,我很确定 LuaTeX 可以在没有这些文件的情况下使用——但 LuaTeX 也不是很快……):非常快,因为只使用了 listings 包
  • 是否依赖特定的 TeX 引擎(例如 LuaTeX):否

这是我的完整笔记,将解决方案与其他解决方案进行比较。如果您想依赖现有包而不是在文档中使用 36 行 LaTeX 代码,这可能会有所帮助。(我正在考虑根据我的发现创建一个包)。

使用自定义 LaTeX 环境进行示例演示

背景和问题陈述

我们想要展示 LaTeX 示例。它们应该同时显示为 LaTeX 源和渲染输出。

决策驱动

  • 一次写入 - 有两个输出(源和渲染)
  • 与所有包装有良好的互动
  • 应支持浮动
  • 应支持无需特殊配置的编译(例如--shell-escape

考虑的选项

也可以看看

决策结果

选择的选项:“自定义解决方案”,因为解决了所有力量。

积极影响

  • 适用于浮点数和变音符号

负面后果

  • 向用户呈现的不仅仅是最少的代码

选项的优缺点

cnltx-example

提示:粗体打字机关键字可以由 LuxiMono 包生成(由 listings 包提示)。

例子

  • 很好,因为允许自动设置 minipages 以正确呈现 LaTeX 源。
  • 不好,因为它是 GPL 许可的,因此要求所有 tex 文件也必须是 GPL 许可的。
  • 不好,因为它不完全支持浮动环境。参见例子#1了解详情。

显示表达式

tcolorbox、latexdemo、tkzexample、fancyvrb-ex

  • 很好,因为盒子很漂亮
  • 不好,因为它们都不支持浮动环境

动词

  • 不好,因为它不支持浮动环境

列表文档

  • 不好,因为只能在列表文档中正常工作(否则会导致问题)

ydoc-解释

银胶

包括.tex图形。

  • 不好,因为源渲染和渲染输出必须“在顶部”完成。

铸造

源代码包含example环境(取自http://blog.karssen.org/2009/11/15/a-latex-example-environment/):https://github.com/gpoore/minted/blob/5d72859d714a6f2f6a42eec524476994d954b960/source/minted.dtx#L134

  • 不好,因为没有处理保护。

自制独立包裹

  • 很好,因为可以排版完整的文档
  • 不好,因为需要 -write-18

相关内容