我正在写一篇关于 LaTeX 用法的(较长的)文章,我想将一些 LaTeX 源代码与其结果一起排版——但我不确定如何实现它。
我知道这个问题但是,它只列出了几种替代方案。我感兴趣的更像是比较。我特别感兴趣的是以下特征(或缺乏特征):
语法高亮的可能性。
依赖外部工具(例如 Perl/Python 脚本)和/或
\write18
。定制布局的可能性/简易性。
可以排版代码片段和/或完整文档(
\documentclass
等等)。速度(我会有相当多的 LaTeX 代码片段,甚至可能超过一百个,而且我通常在一台速度很慢的上网本上工作)。我认为实现我想要的目标的唯一方法是通过写入外部文件,这很慢;另一方面,我很确定 LuaTeX 可以在没有这些文件的情况下使用——但 LuaTeX 也不是很快……)
依赖于特定的 TeX 引擎(例如 LuaTeX)。
没有功能(或缺少功能)对我来说不是什么大问题(也许除了自定义布局的可能性 - 例如,代码和结果的水平或垂直对齐,sverb
不是我最喜欢的选择),所以即使一个包没有特定的功能,我们也欢迎你把它包括进去。
为了完整性,也欢迎 ConTeXt 解决方案。
我建议每个答案一个包。
答案1
在我的软件包手册中,我使用了一个自定义软件包来编写代码和示例,它结合了listings
和mdframed
用于显示代码。我并没有真正打算将其公开(这就是为什么它有很多怪癖,应该在某个时候解决...)但它在 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
)
考虑的选项
- 自定义解决方案来呈现 LaTeX 代码和渲染输出
cnltx-example
(部分cnltx
)examplep
tcolorbox
showexpl
latexdemo
tkzexample
(部分tkz-doc
)fancyvrb-ex
(部分facnyvrb
)sverb
lstdoc
(部分listings
)ydoc-expl
(部分ydoc
)gincltex
minted
- 自制独立包裹
也可以看看
决策结果
选择的选项:“自定义解决方案”,因为解决了所有力量。
积极影响
- 适用于浮点数和变音符号
负面后果
- 向用户呈现的不仅仅是最少的代码
选项的优缺点
cnltx-example
提示:粗体打字机关键字可以由 LuxiMono 包生成(由 listings 包提示)。
- 很好,因为提供漂亮的盒子
- 很好,因为提供浮动环境
- 不好,因为浮动环境必须通过几行 LaTeX 代码
- 不好,因为代码需要修补先显示代码
- 不好,因为不支持变音符号
例子
- 很好,因为允许自动设置 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