最近,在用Jupyter notebook写一些带解释说明性的Python语言教程,同时需要生成pdf格式文件。我利用pandoc将.ipynb转换成了
LaTeX
\LaTeX
LATE?X代码,利用这些代码,我个性化自己需要的书籍模板(documentclass 为book)。之所以这样做,是因为由Jupyter notebook直接转成的pdf,好多地方不符合我的要求,包括标题、日期等,况且是article模板。转成
LaTeX
\LaTeX
LATE?X代码后,我可以按我自己的风格写,高度的灵活性。我也挺佩服Jupyter notebook的设计者们,能给出那么多灵活的接口,包括
LaTeX
\LaTeX
LATE?X。解决了好多问题后,但是还是遇到了一个问题。在此值得记录如下。
问题描述
在Jupyter notebook中,Python代码和其代码的输出有明显的区分,分别带有In、Out标识,如下图: 但是,利用由同一.ipynb文件转成的
LaTeX
\LaTeX
LATE?X代码,进而利用TexLive生成的pdf文件内容中,却不含In、Out标识了,如下图: 这是一个我想解决的问题。搜了搜国内外的相关技术论坛,没有结果,找不到与我一样遇到这个问题的人。没办法,只能自己动脑筋,自己解决问题了。
解决思路和过程
这只能从
LaTeX
\LaTeX
LATE?X的代码上解决问题。我使用了
LaTeX
\LaTeX
LATE?X好多年,无论是基础的利用已有的模板撰写上,还是高级的设计一个模板上,都涉猎和深入过。我有信心解决该问题。
首先需要找到产生不带In、Out标识的
LaTeX
\LaTeX
LATE?X代码
这很好定位,相信用过
LaTeX
\LaTeX
LATE?X的人,都能做到,与产生输出[3] 相对应的代码如下:
\prompt{Out}{outcolor}{3}{\boxspacing}
很显然,上面是一条普通的
LaTeX
\LaTeX
LATE?X代码,其中第1个参数明显带有Out字样。那为什么没显示出来呢?只能从命令\prompt 的定义找起。该命令的定义,也是由Jupyter notebook转换而来。我们也能很容易找到定义该命令的代码,如下:
\newcommand{\prompt}[4]{
{\ttfamily\llap{{\color{#2}[#3]:\hspace{3pt}#4}}\vspace{-\baselineskip}}
}
请大家花些功夫了解\newcommand 的用法,它是一个定义命令的命令。上述代码定义的命令\prompt 有四个参数,但在命令的定义体中却只使用了后面三个参数,第一个参数没有使用,而最上面代码中的Out正好处在第一个参数的位置。找到病因了。
解决方案
由上面分析可知,既然定义\prompt 时,第1参数没用上,且第1个参数的内容正好是我需要的In、Out标识,那么我在定义\prompt 时,将第1个参数使用上不就可以了吗。 更改后的定义\prompt 的代码如下:
\newcommand{\prompt}[4]{
{\ttfamily\llap{{\color{#2}#1 [#3]:\hspace{3pt}#4}}\vspace{-\baselineskip}}
}
重新编译
LaTeX
\LaTeX
LATE?X,生成的结果如下图: 可以看出,我已成功解决了该问题。
感悟
之前,我自己也有疑问,学那么多深入的
LaTeX
\LaTeX
LATE?X到底有什么用。今天遇到的问题,让我明白,之前学的知识,还真能用上。知识先尽可能多地学,因为指不定哪一天就用上了,用上后,能让自己有满满的成就感。
尤其是软件工程类的知识,还是要尽可能多地学。许多学生问,我在教科书上学的东西,为什么在工作岗位的项目上没用上?我的回答是,1)你自己水平太低,实际用上了却不知;2)你的项目太水。
|