Skip to content

Commit

Permalink
代码跳转格式、1.1节继续
Browse files Browse the repository at this point in the history
  • Loading branch information
kanition committed Mar 5, 2021
1 parent c2c436a commit 2306780
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 0 deletions.
57 changes: 57 additions & 0 deletions content/chap01.tex
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,62 @@ \section{文学编程}\label{sec:文学编程}
你会读到pbrt渲染系统的\emph{完整}实现,
而不仅仅是高层叙述。

文学程序是\keyindex{元语言}{metalanguage}{}
写成的,该语言把文档格式语言(例如\TeX 或HTML)
和编程语言(例如C++)结合起来。
两套分离的系统会这样处理程序:
\keyindex{编排器}{weaver}{literate programming文学编程}
把文学程序转换成适合排版的文档,
\keyindex{整合器}{tangler}{literate programming文学编程}
则生成可供编译的源码
\sidenote{译者注:我不太确定编排器和整合器的翻译是否合适。}。
虽然我们的文学编程系统是自研的,
但很大程度上受到了Norman Ramsey的\emph{noweb}系统的影响。

文学编程元语言提供了两个重要功能。
第一个是把行文与源码结合的能力。
这个功能让对程序的阐述和它实际的源码一样重要,
促使设计和文档做得更细致。
第二个是该语言提供了向读者展示程序代码的机制,
其与输入编译器的顺序完全不同。
因此可以按逻辑顺序阐述程序。
每一段具有名称的代码块作\keyindex{代码片}{fragment}{},
且每个代码片可以通过名称引用其他代码片。

例如,考虑一个负责初始化程序全部全局变量的函数
\footnote{本节的代码仅用作示例,不属于pbrt的一部分。}
{\ttfamily InitGlobals()}:
\begin{lstlisting}[language=C++]
void InitGlobals() {
nMarbles = 25.7;
shoeSize = 13;
dielectric = true;
}
\end{lstlisting}
虽然很简短,但没有任何上下文的情况下很难搞懂这个函数。
比如为什么变量{\ttfamily nMarbles}采用浮点值?
刚看这段代码时,
就得在整个程序里寻找每个变量是在哪里声明的、怎么用的,
好搞清楚它的目的和合法值的含义。
尽管这样的系统结构对编译器来说没问题,
但人类阅读者更愿意看到
每个变量的初始化代码是分开呈现的,
且紧挨着实际声明和使用这些变量的代码。

在文学程序中,可以把{\ttfamily InitGlobals()}改成这样的写法:
\begin{lstlisting}[language=C++]
`\initcode{Function Definitions}{=}`
void InitGlobals() {
`\refcode{Initialize Global Variables}{}`
}
\end{lstlisting}

oooooooooooooooooooooooooooooo

\begin{lstlisting}[language=C++]
`\initcode{Initialize Global Variables}{}`
shoeSize = 13;
dielectric = true;
\end{lstlisting}
\section{基于物理的渲染简史}\label{sec:基于物理的渲染简史}

44 changes: 44 additions & 0 deletions structure.tex
Original file line number Diff line number Diff line change
Expand Up @@ -545,3 +545,47 @@
\fi
}
}


%----------------------------------------------------------------------------------------
% code show
%----------------------------------------------------------------------------------------
\usepackage{listings}
\lstset{%
language={C++}, %language为,还有{[Visual]C++}{[ISO]C++}
alsolanguage=[ANSI]C, %可以添加很多个alsolanguage,如alsolanguage=matlab,alsolanguage=VHDL等
tabsize=4, %
basicstyle=\ttfamily\footnotesize, % 设置代码的大小
keywordstyle=\color[RGB]{0,84,166}\bfseries, %代码关键字
stringstyle=\ttfamily\color[RGB]{33,166,86}, % 代码字符串的特殊格式
commentstyle=\color[RGB]{115,48,11}\scriptsize\rmfamily, %注释
rulecolor=\color[RGB]{243,102,25},%代码边框
frame=leftline, %代码框
framerule=2pt,
showstringspaces=false,%不显示代码字符串中间的空格标记
keepspaces=true,
breakindent=20pt,
numbers=left,%左侧显示行号 往左靠,还可以为right,或none,即不加行号
stepnumber=1,%若设置为2,则显示行号为1,3,5,即stepnumber为公差,默认stepnumber=1
numberstyle={\color[RGB]{33,166,86}\scriptsize} ,%设置行号的大小,大小有tiny,scriptsize,footnotesize,small,normalsize,large等
numbersep=8pt, %设置行号与代码的距离,默认是5pt
showspaces=false, %
flexiblecolumns=true, %
breaklines=true, %对过长的代码自动换行
breakautoindent=true,
aboveskip=1em, %代码块边框
tabsize=2,
showstringspaces=false, %不显示字符串中的空格
backgroundcolor=\color{black!5}, %代码背景色,或\color[rgb]{0.91,0.91,0.91}
escapeinside=``, %在``里显示中文 %% added by http://bbs.ctex.org/viewthread.php?tid=53451
fontadjust,
captionpos=t,
framextopmargin=2pt,framexbottommargin=2pt,abovecaptionskip=-3pt,belowcaptionskip=3pt,
xleftmargin=4em,xrightmargin=4em, % 设定listing左右的空白
texcl=true, % 设定中文冲突,断行,listing数字的样式
extendedchars=false,% 设定中文冲突
columns=flexible, % 列模式
mathescape=true % 设定数学环境输入
}
\newcommand\initcode[2]{\color[RGB]{142,12,242}\itshape{<<{#1}>>#2}\label{code:#1}} %代码段名称定义
\newcommand\refcode[2]{\color[RGB]{142,12,242}\itshape{<<\hyperref[code:#1]{#1}>>#2}} %代码段引用跳转

0 comments on commit 2306780

Please sign in to comment.