diff options
author | Norbert Preining <preining@logic.at> | 2011-11-24 04:25:59 +0000 |
---|---|---|
committer | Norbert Preining <preining@logic.at> | 2011-11-24 04:25:59 +0000 |
commit | 1766bcbd5d57f14320a8adcbed669b358001f8fc (patch) | |
tree | 7fda4b2f4570ac14937f7f1e861a3a6a8649588a /Master/texmf-dist/source/latex/diagbox/diagbox.dtx | |
parent | 213491417fe149fd2ee04205f7951abbf7c45629 (diff) |
diagbox 2011/11/23 v2.0
git-svn-id: svn://tug.org/texlive/trunk@24646 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/diagbox/diagbox.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/diagbox/diagbox.dtx | 582 |
1 files changed, 501 insertions, 81 deletions
diff --git a/Master/texmf-dist/source/latex/diagbox/diagbox.dtx b/Master/texmf-dist/source/latex/diagbox/diagbox.dtx index 9c323bc01ff..a061992b3d7 100644 --- a/Master/texmf-dist/source/latex/diagbox/diagbox.dtx +++ b/Master/texmf-dist/source/latex/diagbox/diagbox.dtx @@ -26,19 +26,31 @@ %<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01] %<package>\ProvidesPackage{diagbox} %<*package> - [2011/11/21 v1.0 Making table heads with diagonal lines] + [2011/11/23 v2.0 Making table heads with diagonal lines] %</package> % %<*driver> -\documentclass[a4paper]{ltxdoc} +\documentclass[letterpaper]{ltxdoc} \AtBeginDocument{ \DeleteShortVerb{\|} \MakeShortVerb{\"}} \usepackage{diagbox} -\usepackage{geometry} +\usepackage[left=1.7in,top=1in,bottom=1in]{geometry} \usepackage{fvrb-ex} -\usepackage[UTF8,hyperref]{ctex} -\usepackage[pdfstartview=FitH]{hyperref} +\usepackage[UTF8]{ctex} +\makeatletter +\renewcommand\glossary@prologue{% + \pdfbookmark[1]{版本历史}{history} + \section*{版本历史} + \markboth{版本历史}{版本历史}} +\renewcommand\index@prologue{% + \pdfbookmark[1]{Index / 代码索引}{index} + \section*{Index / 代码索引} + \markboth{Index / 代码索引}{Index / 代码索引} + 斜体的数字表示对应项说明所在的页码。下划线的数字表示定义所在的代码行号;而直 + 立体的数字表示对应项使用时所在的行号。} +\makeatother +\usepackage[pdfstartview=FitH,bookmarksnumbered,colorlinks]{hyperref} \EnableCrossrefs \CodelineIndex \RecordChanges @@ -50,7 +62,7 @@ %</driver> % \fi % -% \CheckSum{201} +% \CheckSum{521} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z @@ -69,7 +81,7 @@ % Right brace \} Tilde \~} % % -% \changes{v1.0}{2011/11/21}{初始版本} +% \changes{v1.0}{2011/11/21}{初始版本。} % % \DoNotIndex{\newcommand, \newenvironment, \@nameuse, \@pkgextension, % \@reserveda, \@tfor, \begin, \begingroup, \box, \csname, \def, \define@key, @@ -77,12 +89,14 @@ % \expandafter, \fi, \hbox, \ht, \ifcsname, \ifdim, \ifx, \Line, \makebox, % \newbox, \newdimen, \p@, \PackageError, \pkg, \put, \relax, \RequirePackage, % \setbox, \setkeys, \setlength, \strip@pt, \unexpanded, \unitlength, -% \vcenter, \wd, \xdef, \z@} +% \vcenter, \wd, \xdef, \z@, \@ifnextchar, \bgroup, \FPadd, \FPmul, \FPneg, +% \FPsub, \FPupn, \let, \unless, \hspace} % % \providecommand*{\pkg}{\textsf} % \GetFileInfo{diagbox.dtx} % \title{\hypertarget{English}{\pkg{diagbox} Package (\fileversion)} -% \makebox[0pt]{\hspace{5cm}\hyperlink{Chinese}{\textsf{中文版}}}\\ +% \makebox[0pt][l]{\hspace{3cm}\large +% \hyperlink{Chinese}{$\Rightarrow$ \textsf{中文版}}}\\ % Making Table Heads with Diagonal Lines} % \author{Leo Liu \\ \path{leoliu.pku@gmail.com}} % \date{\filedate} @@ -91,25 +105,37 @@ % % \section{Introduction} % -% \pkg{diagbox} is a replacement of old \pkg{slashbox} package. I write this +% \pkg{diagbox} is a replacement of old \pkg{slashbox} package\footnote{By +% Koichi Yasuoka and Toru Sato. Available on +% \url{CTAN://macros/latex/contrib/slashbox/slashbox.sty}}. I write this % package simply because that \pkg{slashbox} is not available in \TeX\ Live % for licening problems. \pkg{slashbox} has no explicit license information % available, but \pkg{diagbox} is under LPPL. % % \pkg{diagbox} is a modern alternative of \pkg{slashbox}. I changed the % user interface to use a key-value syntax, get rid of some restrictions of -% \pkg{slashbox}, use \pkg{pict2e} to draw diagonal lines. \pkg{diagbox} -% package also provides compatible macros of \pkg{slashbox}, but the result is -% a little different. +% \pkg{slashbox}, use \pkg{pict2e} to draw diagonal lines. Especially, this +% package also provides ability to make a box with two diagonal lines in it. +% All these can be obtained by a "\diagbox" command. +% +% As a replacement of \pkg{slashbox}, \pkg{diagbox} package also provides +% compatible macros of \pkg{slashbox}, but the result is a little different. % % To use \pkg{diagbox}, \eTeX{} is needed. And \pkg{diagbox} requires -% \pkg{pict2e} package. +% \pkg{pict2e}, \pkg{keyval} and \pkg{fp} packages. +% % % \section{Usage} % +% \subsection{Basic usage} +% +% To load the package, just put this in the preamble: +% \begin{Verbatim} +% \usepackage{diagbox} +% \end{Verbatim} % % \DescribeMacro{\diagbox} -% "\diagbox" is the main command. It takes two arguments, to produce a box +% "\diagbox" is the main command. It can take two arguments, to produce a box % with a diagonal line from north west to south east. % % For example:\\ @@ -123,59 +149,152 @@ % \hline % \end{tabular} % \end{SideBySideExample} -% % \medskip -% "\diagbox" can take an optional argument in key-value syntax to specify the +% +% "\diagbox" can also take three arguments, to draw a table head with two +% diagbox lines. For example, +% \begin{Example}[frame=single,numbers=left] +% \begin{tabular}{|l|ccc|} +% \hline +% \diagbox{Time}{Room}{Day} & Mon & Tue & Wed \\ +% \hline +% Morning & used & used & \\ +% Afternoon & & used & used \\ +% \hline +% \end{tabular} +% \end{Example} +% +% \subsection{More options} +% +% "\diagbox" can take a key-value list as an optional argument to specify the % width and height of the box, the direction of the diagonal line, and the -% trimming margin: +% trimming margins: % \begin{description} -% \item[width] Specify the width of the box explicitly. -% \item[height] Specify the height of the box explicitly. -% \item[dir] Specify the direction of the diagonal line. The value can be "SE" -% and "NE". Default value is "SE" (from north west to south east). +% \item[width] Specify the width of the box explicitly. If it is omitted, +% package will calculate a width automatically. +% +% \item[height] Specify the height of the box explicitly. If it is omitted, +% package will calculate a height automatically. +% +% \item[dir] Specify the direction of the diagonal line. The value can be +% "NW", "NE", "SW" and "SE". Default value is "NW". The meaning of the values +% see below. +% \begin{itemize} +% \item "\diagbox[dir="\meta{direction}"]{A}{B}" in a table looks:\\ +% \begin{tabular}{ll@{\qquad}ll} +% "NW" or "SE":& +% \begin{tabular}{|c|} \hline \diagbox[dir=SE]{A}{B} \\\hline \end{tabular} & +% "SW" or "NE":& +% \begin{tabular}{|c|} \hline \diagbox[dir=NE]{A}{B} \\\hline \end{tabular} +% \end{tabular} +% \item "\diagbox[dir="\meta{direction}"]{A}{M}{B}" in a table looks:\\ +% \begin{tabular}{*4{ll@{\qquad}}} +% "NW"& +% \begin{tabular}{|c|} \hline \diagbox[dir=NW]{A}{M}{B} \\\hline \end{tabular}& +% "NE"& +% \begin{tabular}{|c|} \hline \diagbox[dir=NE]{A}{M}{B} \\\hline \end{tabular}& +% "SW"& +% \begin{tabular}{|c|} \hline \diagbox[dir=SW]{A}{M}{B} \\\hline \end{tabular}& +% "SE"& +% \begin{tabular}{|c|} \hline \diagbox[dir=SE]{A}{M}{B} \\\hline \end{tabular} +% \end{tabular} +% \end{itemize} +% % \item[trim] Specify the margin to be trimmed. The value can be "l", "r", and -% "lr", "rl". +% "lr", "rl". This helps the slash line exceeds the boundary when "@{}" column +% specifier is used. % \end{description} % -% Here is a more complex example: +% Here is a more complex example to show the usage of the options: % \begin{Example}[frame=single,numbers=left] -% \begin{tabular}{|@{}l|c|c|c@{}|} +% \begin{tabular}{|@{}l|c|c|r@{}|} % \hline % \diagbox[width=5em,trim=l]{Time}{Day} & Mon & Tue & Wed\\ % \hline % Morning & used & used & used\\ % \hline -% Afternoon & & used & \diagbox[dir=NE,height=2em,trim=r]{A}{B} \\ +% Afternoon & & used & \diagbox[dir=SW,height=2em,trim=r]{A}{B} \\ % \hline % \end{tabular} % \end{Example} % % \bigskip +% What's more, you can use "\\" to break lines in "\diagbox". Manual setting +% of the height of the head may be needed. For example, +% \begin{Example}[frame=single,numbers=left] +% \begin{tabular}{|c|} +% \hline +% \diagbox[height=45pt]{line\\heads}{column\\heads} \\ +% \hline +% \end{tabular} +% \end{Example} +% +% \subsection{Compatibility with \pkg{slashbox}} +% +% \pkg{diagbox} package emulates \pkg{slashbox} and also prevents +% \pkg{slashbox} to be loaded. +% +% \pkg{diagbox} package provides "\slashbox" and "\backslashbox" which syntax +% similar to \pkg{slashbox} package. However, the results of the two packages +% are a little different. These two commands are for compatibility only, it is +% better to use "\diagbox" instead for new documents. +% % \DescribeMacro{\backslashbox} % "\backslashbox" works as "\diagbox", but it takes two optional arguments to % specify the "width" and "trim" options. % % \DescribeMacro{\slashbox} -% "\slashbox" works as "\diagbox[dir=NE]", and takes two optional arguments to +% "\slashbox" works as "\diagbox[dir=SW]", and takes two optional arguments to % specify the "width" and "trim" options. % -% The syntax of "\slashbox" and "\backslashbox" comes from \pkg{slashbox} -% packages. \pkg{diagbox} package emulates \pkg{slashbox} and also prevents -% \pkg{slashbox} to be loaded. However, the results of the two packages are -% a little different. These two commands are for compatibility only, it is -% better to use "\diagbox" instead. +% For example,\\ +% \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.45\linewidth] +% \begin{tabular}{|c|c|c|} \hline +% \backslashbox[2cm]{num}{alpha} +% & A & B \\\hline +% 1 & A1 & B1 \\\hline +% 2 & A2 & B2 \\\hline +% \end{tabular} +% \end{SideBySideExample} % % -% \section{Bugs and TODO} +% \section{Known issues and TODO} % -% I will provide a new command to produce a three-part box with two diagonal -% lines in later version. +% Known issues: +% \begin{itemize} +% \item The result of "\slashbox" and "\backslashbox" is different with +% \pkg{slashbox} package. The algorithms to calculate the width and height are +% different; and the results of the second optional argument of "\slashbox" +% (i.e. "trim" key in "\diagbox") in the two packages are differernt. % +% This is not a bug. Usually the width calculated by \pkg{diagbox} is more +% safe than \pkg{slashbox}. % +% \item +% The cell with "\diagbox" should be the widest one of the column. Otherwise +% the slash line cannot exceeds the boundary. For example,\\[1ex] +% \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.45\linewidth] +% \begin{tabular}{|c|} \hline +% \diagbox{A}{B} \\\hline +% Very long term \\\hline +% \end{tabular} +% \end{SideBySideExample} +% \\[1ex] +% This can be solved by setting a wider "width" option of "\diagbox" manually. +% \end{itemize} +% +% TODO: +% \begin{itemize} +% \item +% Improve the document of the source code. The algorithm of "\diagbox@triple" +% should be explained in detail. However, the explanations would be only +% available in Chinese, I'm sorry. +% \end{itemize} % % % \title{\hypertarget{Chinese}{\pkg{diagbox} 宏包(\fileversion)} -% \makebox[0pt]{\hspace{5cm}\hyperlink{English}{\textsf{English Version}}}\\ +% \makebox[0pt][l]{\hspace{3cm}\large +% \hyperlink{English}{$\Rightarrow$ \textsf{English Version}}}\\ % 制做斜线表头} % \author{刘海洋 \\ \path{leoliu.pku@gmail.com}} % \date{\filedate} @@ -185,23 +304,34 @@ % % \section{简介} % -% \pkg{diagbox} 设计用来代替旧的 \pkg{slashbox} 宏包。编写这个宏包的缘起是 -% \pkg{slashbox} 因为缺少明确的自由许可信息,被 \TeX\ Live 排除。这个宏包是在 -% LPPL 协议下发行的。 +% \pkg{diagbox} 设计用来代替旧的 \pkg{slashbox} 宏包\footnote{作者 Koichi +% Yasuoka(安岡孝一)与 Sato Toru(佐藤徹)。宏包见 +% \url{CTAN://macros/latex/contrib/slashbox/slashbox.sty}。}。编写这个宏包的缘 +% 起是 \pkg{slashbox} 因为缺少明确的自由许可信息,被 \TeX\ Live 排除。这个宏包 +% 是在 LPPL 协议下发行的。 +% +% \pkg{diagbox} 是 \pkg{slashbox} 宏包的一个现代的版本。它采用了新的 key-value +% 式语法参数,去除了 \pkg{slashbox} 原有的一些长度限制,并调用 \pkg{pict2e} 宏 +% 包画斜线;特别还添加了绘制两条斜线的表头的新功能。 % -% \pkg{diagbox} 是 \pkg{slashbox} 宏包的一个较现代的版本。这里我采用了新的 -% key-value 式语法参数,去除了 \pkg{slashbox} 原有的一些长度限制,并调用 -% \pkg{pict2e} 宏包画斜线。\pkg{diagbox} 除了提供自己的新命令,也提供了 +% 作为 \pkg{slashbox} 的代替,\pkg{diagbox} 除了提供自己的新命令,也提供了 % \pkg{slashbox} 原有的两个命令,语法不变,编译结果略有区别。 % -% \pkg{diagbox} 依赖 \eTeX{} 扩展(这在目前总是可用的),依赖 \pkg{pict2e} 宏 -% 包。 +% \pkg{diagbox} 依赖 \eTeX{} 扩展(这在目前总是可用的),依赖 \pkg{pict2e}, +% \pkg{keyval} 和 \pkg{fp} 宏包。 % % \section{用法说明} % +% \subsection{基本用法} +% +% 要使用本宏包,首先在导言区调用: +% \begin{Verbatim} +% \usepackage{diagbox} +% \end{Verbatim} +% % \DescribeMacro{\diagbox} -% "\diagbox" 是宏包提供的主要命令。它带有两个必选参数,表示要生成斜线表头的两 -% 部分内容。默认斜线是从西北到东南方向的。 +% "\diagbox" 是宏包提供的主要命令。它可以带有两个必选参数,表示要生成斜线表头的 +% 两部分内容。默认斜线是从西北到东南方向的。 % % 例如:\\ % \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.45\linewidth] @@ -214,49 +344,141 @@ % \hline % \end{tabular} % \end{SideBySideExample} -% % \medskip -% "\diagbox" 还可以带一个可选参数,里面用 key-value 的语法设置宽度、方向等更多 -% 的选项: +% +% \changes{v2.0}{2011/11/22}{增加有三部分、双斜线的表头格式。} +% "\diagbox" 也可以接受三个参数,这样就会生成带有两条斜线的表头,例如: +% \begin{Example}[frame=single,numbers=left] +% \begin{tabular}{|l|ccc|} +% \hline +% \diagbox{Time}{Room}{Day} & Mon & Tue & Wed \\ +% \hline +% Morning & used & used & \\ +% Afternoon & & used & used \\ +% \hline +% \end{tabular} +% \end{Example} +% +% \subsection{更多参数设置} +% +% "\diagbox" 还可以在前面带一个可选参数,里面用 key-value 的语法设置宽度、方向 +% 等更多的选项: % \begin{description} -% \item[width] 明确指定盒子的总宽度。 +% \item[width] 明确指定盒子的总宽度。如果省略,则会自动计算能够放下所有内容的 +% 宽度。 % \item[height] 明确指定盒子的总高度。 -% \item[dir] 指定斜线方向。可以取 "NE"(划向东北)和 "SE"(划向东南)两个值, -% 默认值是 "SE"。 +% \item[dir] 指定斜线方向。可以取 "NW"(西北)、"NE"(东北)、"SW"(西南)、 +% "SE"(东南)四种方向。在只有一条斜线的表头中,"NE" 与 "SW"、 "SE" 与 "NW" 是 +% 等价的。斜线方向的默认值是 "NW"。 +% +% "\diagbox[dir="\meta{方向}"]{A}{B}" 在表格中的效果:\\ +% \begin{tabular}{ll@{\qquad}ll} +% "NW" 或 "SE":& +% \begin{tabular}{|c|} \hline \diagbox[dir=SE]{A}{B} \\\hline \end{tabular} & +% "SW" 或 "NE":& +% \begin{tabular}{|c|} \hline \diagbox[dir=NE]{A}{B} \\\hline \end{tabular} +% \end{tabular} +% +% "\diagbox[dir="\meta{方向}"]{A}{M}{B}" 在表格中的效果:\\ +% \begin{tabular}{*4{ll@{\qquad}}} +% "NW"& +% \begin{tabular}{|c|} \hline \diagbox[dir=NW]{A}{M}{B} \\\hline \end{tabular}& +% "NE"& +% \begin{tabular}{|c|} \hline \diagbox[dir=NE]{A}{M}{B} \\\hline \end{tabular}& +% "SW"& +% \begin{tabular}{|c|} \hline \diagbox[dir=SW]{A}{M}{B} \\\hline \end{tabular}& +% "SE"& +% \begin{tabular}{|c|} \hline \diagbox[dir=SE]{A}{M}{B} \\\hline \end{tabular} +% \end{tabular} +% % \item[trim] 设置左边界或右边界不计算额外的空白,可以取值为 "l", "r", "lr" 或 % "rl"。这个选项在列格式包含 "@{}" 时将会有用。 % \end{description} % -% 一个更繁杂的例子: +% \changes{v2.0}{2011/11/23}{变更 "trim" 选项的行为,去掉了使用 "trim" 选项时 +% 内部的间距。这与 \pkg{slashbox} 行为不同。} +% 一个更复杂的例子: % \begin{Example}[frame=single,numbers=left] -% \begin{tabular}{|@{}l|c|c|c@{}|} +% \begin{tabular}{|@{}l|c|c|r@{}|} % \hline % \diagbox[width=5em,trim=l]{Time}{Day} & Mon & Tue & Wed\\ % \hline % Morning & used & used & used\\ % \hline -% Afternoon & & used & \diagbox[dir=NE,height=2em,trim=r]{A}{B} \\ +% Afternoon & & used & \diagbox[dir=SW,height=2em,trim=r]{A}{B} \\ % \hline % \end{tabular} % \end{Example} -% % \bigskip +% +% 此外,"\diagbox" 的表头内容还可以用 "\\" 手工换行。此时通常需要对自动计算的 +% 表头高度进行手工调整。例如: +% \begin{Example}[frame=single,numbers=left] +% \begin{tabular}{|c|} +% \hline +% \diagbox[height=45pt]{line\\heads}{column\\heads} \\ +% \hline +% \end{tabular} +% \end{Example} +% +% \subsection{对 \pkg{slashbox} 宏包的兼容性} +% +% 在使用 \pkg{diagbox} 宏包时,会模拟 \pkg{slashbox} 宏包的功能,并禁止 +% \pkg{slashbox} 再被调用。 +% +% \pkg{diagbox} 宏包提供了与 \pkg{slashbox} 大致相同的 "\slashbox" 与 +% "\backslashbox" 两个命令。 "\slashbox" 与 "\backslashbox" 的语法来自 +% \pkg{slashbox} 宏包,排版效果略有区别。这两个命令仅在旧文档中作为兼容命令使 +% 用。实际中使用 "\diagbox" 更为方便。 +% % \DescribeMacro{\backslashbox} % "\backslashbox" 基本功能与 "\diagbox" 类似。它带有两个可选参数,分别表示 % "\diagbox" 中的 "width" 与 "trim" 选项。 % % \DescribeMacro{\slashbox} -% "\slashbox" 基本功能与 "\diagbox[dir=NE]" 类似。它也带有两个可选参数,表示 +% "\slashbox" 基本功能与 "\diagbox[dir=SW]" 类似。它也带有两个可选参数,表示 % "\diagbox" 中的 "width" 和 "tirm" 选项。 % -% "\slashbox" 与 "\backslashbox" 的语法来自 \pkg{slashbox} 宏包。\pkg{diagbox} -% 宏包模拟了 \pkg{slashbox} 宏包的功能,并禁止 \pkg{slashbox} 再被调用。这两个 -% 命令仅在旧文档中作为兼容命令使用。实际中使用 "\diagbox" 更为方便。 -% +% 例如:\\ +% \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.45\linewidth] +% \begin{tabular}{|c|c|c|} \hline +% \backslashbox[2cm]{num}{alpha} +% & A & B \\\hline +% 1 & A1 & B1 \\\hline +% 2 & A2 & B2 \\\hline +% \end{tabular} +% \end{SideBySideExample} % % \section{已知问题和未来版本} % -% 未来版本会增加带有两条斜线的表头命令。这部分代码是以前写过的,正在整理中。 +% 已知问题: +% \begin{itemize} +% \item "\slashbox" 与 "\backslashbox" 命令的效果与在 \pkg{slashbox} 宏包中不 +% 同。两个宏包在计算盒子宽度和高度时,使用了不同的算法;同时,在处理 +% "\slashbox" 第二个可选参数(即 "\diagbox" 的 "trim" 键)时,使用的方式也不一 +% 样。 +% +% 这不是 bug。通常 \pkg{diagbox} 计算出的宽度比 \pkg{slashbox} 的结果更安全一 +% 些。 +% +% \item +% "\diagbox" 生成的单元格必须是表列中最宽的一个。如果不能达到最宽,则画出的斜 +% 线不能保证在正确的位置。例如:\\[1ex] +% \begin{SideBySideExample}[frame=single,numbers=left,xrightmargin=.45\linewidth] +% \begin{tabular}{|c|} \hline +% \diagbox{A}{B} \\\hline +% Very long term \\\hline +% \end{tabular} +% \end{SideBySideExample} +% \\[1ex] +% 此时可以手工设置较宽的 "\diagbox" 的 "width" 选项,解决此问题。 +% \end{itemize} +% +% 未尽的工作: +% \begin{itemize} +% \item 源代码的文档需要改进。特别是在 "\diagbox@triple" 中的宽度和高度计算算 +% 法需要详细说明。 +% \end{itemize} % % \StopEventually{} % @@ -276,25 +498,49 @@ % 绘图依赖 \pkg{pict2e} 宏包。 % \begin{macrocode} \RequirePackage{pict2e} +% \end{macrocode} +% 计算依赖 \pkg{fp} 宏包。 +% \begin{macrocode} +\RequirePackage[nomessages]{fp} +% \end{macrocode} +% +% 分配用到的盒子寄存器。它们分别对应于 "\diagbox" 三个必选参数的内容。 +% \begin{macrocode} \newbox\diagbox@boxa \newbox\diagbox@boxb +\newbox\diagbox@boxm +% \end{macrocode} +% 分配长度变量。 +% \begin{macrocode} \newdimen\diagbox@wd \newdimen\diagbox@ht \newdimen\diagbox@sepl \newdimen\diagbox@sepr +% \end{macrocode} +% +% 定义 "\diagbox" 的键值选项。 +% \begin{macrocode} \define@key{diagbox}{width}{% \setlength{\diagbox@wd}{#1}} \define@key{diagbox}{height}{% \setlength{\diagbox@ht}{#1}} \define@key{diagbox}{trim}{% \@tfor\@reserveda:=#1\do{% - \setlength{\csname diagbox@sep\@reserveda\endcsname}{\z@}}} + \ifcsname diagbox@sep\@reserveda\endcsname + \setlength{\csname diagbox@sep\@reserveda\endcsname}{\z@}% + \else + \PackageError{diagbox}{Unknown trim option `#1'.}{l, r, lr and rl are supported.}% + \fi}} \define@key{diagbox}{dir}{% - \ifcsname diagbox@pict@#1\endcsname - \def\diagbox@pict@content{\@nameuse{diagbox@pict@#1}}% - \else - \PackageError{diagbox}{Unknown direction `#1'.}{SE and NE is supported.}% + \def\diagbox@dir{#1}% + \unless\ifcsname diagbox@dir@#1\endcsname + \PackageError{diagbox}{Unknown direction `#1'.}{NW, NE, SW, SE are supported.}% + \def\diagbox@dia{NW}% \fi} +\let\diagbox@dir@SE\relax +\let\diagbox@dir@SW\relax +\let\diagbox@dir@NE\relax +\let\diagbox@dir@NW\relax % \end{macrocode} % % \begin{macro}{\diagbox@pict} @@ -305,49 +551,65 @@ \begin{picture} (\strip@pt\dimexpr\diagbox@wd-\diagbox@sepl-\diagbox@sepr\relax,\strip@pt\diagbox@ht) (\strip@pt\diagbox@sepl,0) - \diagbox@pict@content + \@nameuse{diagbox@\diagbox@part @pict@\diagbox@dir} \end{picture}} % \end{macrocode} % \end{macro} % % -% \begin{macro}{\diagbox@pict@SE} +% \begin{macro}{\diagbox@double@pict@SE} % 方向为 "SE" 的斜线盒子内容。 % \begin{macrocode} -\def\diagbox@pict@SE{% +\def\diagbox@double@pict@SE{% \put(0,0) {\makebox(0,0)[bl]{\box\diagbox@boxa}} \put(\strip@pt\diagbox@wd,\strip@pt\diagbox@ht) {\makebox(0,0)[tr]{\box\diagbox@boxb}} \Line(0,\strip@pt\diagbox@ht)(\strip@pt\diagbox@wd,0)} % \end{macrocode} % \end{macro} % +% \begin{macro}{\diagbox@double@pict@NW} +% 方向 "NW" 与 "SE" 相同。 +% \begin{macrocode} +\let\diagbox@double@pict@NW\diagbox@double@pict@SE +% \end{macrocode} +% \end{macro} % -% \begin{macro}{\diagbox@pict@NE} +% \begin{macro}{\diagbox@double@pict@NE} % 方向为 "NE" 的斜线盒子内容。 % \begin{macrocode} -\def\diagbox@pict@NE{% +\def\diagbox@double@pict@NE{% \put(0,\strip@pt\diagbox@ht) {\makebox(0,0)[tl]{\box\diagbox@boxa}} \put(\strip@pt\diagbox@wd,0) {\makebox(0,0)[br]{\box\diagbox@boxb}} \Line(0,0)(\strip@pt\diagbox@wd,\strip@pt\diagbox@ht)} % \end{macrocode} % \end{macro} % +% \begin{macro}{\diagbox@double@pict@NE} +% 方向 "SW" 与 "NE" 相同。 +% \begin{macrocode} +\let\diagbox@double@pict@SW\diagbox@double@pict@NE +% \end{macrocode} +% \end{macro} % -% \begin{macro}{\diagbox} -% 主要的用户命令。三个参数,分别为 key-value 格式的可选项、左半边内容、右半边 -% 内容。这个命令的主要内容是读入参数并计算斜线盒子的大小。 +% +% \begin{macro}{\diagbox@double} +% \changes{v2.0}{2011/11/22}{在使用 "trim" 选项时去掉内容与盒子边界的间距。这 +% 与 \pkg{slashbox} 的行为不同。} +% 分成两部分的盒子。三个参数,分别为 key-value 格式的可选项、左半边内容、右半边 +% 内容。这里的主要工作是读入参数并计算斜线盒子的大小。 % \begin{macrocode} -\newcommand\diagbox[3][]{% +\def\diagbox@double#1#2#3{% \begingroup \diagbox@wd=\z@ \diagbox@ht=\z@ \diagbox@sepl=\tabcolsep \diagbox@sepr=\tabcolsep - \setkeys{diagbox}{dir=SE,#1}% + \def\diagbox@part{double}% + \setkeys{diagbox}{dir=NW,#1}% \setbox\diagbox@boxa=\hbox{% - \begin{tabular}{l@{}}#2\end{tabular}}% + \begin{tabular}{@{\hspace{\diagbox@sepl}}l@{}}#2\end{tabular}}% \setbox\diagbox@boxb=\hbox{% - \begin{tabular}{@{}r}#3\end{tabular}}% + \begin{tabular}{@{}r@{\hspace{\diagbox@sepr}}}#3\end{tabular}}% \ifdim\diagbox@wd=\z@ \ifdim\wd\diagbox@boxa>\wd\diagbox@boxb \diagbox@wd=\dimexpr2\wd\diagbox@boxa+\diagbox@sepl+\diagbox@sepr\relax @@ -363,6 +625,164 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\diagbox@triple@setbox@NW} +% \begin{macrocode} +\def\diagbox@triple@setbox@NW#1#2#3{% + \setbox\diagbox@boxa=\hbox{% + \begin{tabular}{@{\hspace{\diagbox@sepl}}l@{}}#1\end{tabular}}% + \setbox\diagbox@boxm=\hbox{% + \begin{tabular}{@{\hspace{\diagbox@sepl}}l@{}}#2\end{tabular}}% + \setbox\diagbox@boxb=\hbox{% + \begin{tabular}{@{}r@{\hspace{\diagbox@sepr}}}#3\end{tabular}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\diagbox@triple@setbox@SW} +% \begin{macrocode} +\let\diagbox@triple@setbox@SW\diagbox@triple@setbox@NW +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\diagbox@triple@setbox@NW} +% \begin{macrocode} +\def\diagbox@triple@setbox@SE#1#2#3{% + \setbox\diagbox@boxa=\hbox{% + \begin{tabular}{@{\hspace{\diagbox@sepl}}l@{}}#1\end{tabular}}% + \setbox\diagbox@boxm=\hbox{% + \begin{tabular}{@{}r@{\hspace{\diagbox@sepr}}}#2\end{tabular}}% + \setbox\diagbox@boxb=\hbox{% + \begin{tabular}{@{}r@{\hspace{\diagbox@sepr}}}#3\end{tabular}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\diagbox@triple@setbox@NE} +% \begin{macrocode} +\let\diagbox@triple@setbox@NE\diagbox@triple@setbox@SE +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\diagbox@triple@pict@NW} +% \begin{macrocode} +\def\diagbox@triple@pict@NW{% + \put(0,0) {\makebox(0,0)[bl]{\box\diagbox@boxa}} + \put(0,\y) {\makebox(0,0)[tl]{\box\diagbox@boxm}} + \put(\x,\y) {\makebox(0,0)[tr]{\box\diagbox@boxb}} + \Line(0,\yym)(\x,0) + \Line(\xm,\y)(\x,0)} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\diagbox@triple@pict@NE} +% \begin{macrocode} +\def\diagbox@triple@pict@NE{% + \put(0,\y) {\makebox(0,0)[tl]{\box\diagbox@boxa}} + \put(\x,\y) {\makebox(0,0)[tr]{\box\diagbox@boxm}} + \put(\x,0) {\makebox(0,0)[br]{\box\diagbox@boxb}} + \Line(0,0)(\xxm,\y) + \Line(0,0)(\x,\yym)} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\diagbox@triple@pict@SW} +% \begin{macrocode} +\def\diagbox@triple@pict@SW{% + \put(0,\y) {\makebox(0,0)[tl]{\box\diagbox@boxa}} + \put(0,0) {\makebox(0,0)[bl]{\box\diagbox@boxm}} + \put(\x,0) {\makebox(0,0)[br]{\box\diagbox@boxb}} + \Line(0,\ym)(\x,\y) + \Line(\xm,0)(\x,\y)} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\diagbox@triple@pict@SE} +% \begin{macrocode} +\def\diagbox@triple@pict@SE{% + \put(0,0) {\makebox(0,0)[bl]{\box\diagbox@boxa}} + \put(\x,0) {\makebox(0,0)[br]{\box\diagbox@boxm}} + \put(\x,\y) {\makebox(0,0)[tr]{\box\diagbox@boxb}} + \Line(0,\y)(\xxm,0) + \Line(0,\y)(\x,\ym)} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\diagbox@triplebox} +% \changes{v2.0}{2011/11/22}{新增三部分双斜线的盒子} +% 分成三部分的盒子。四个参数,分别为 key-value 格式的可选项、左半边内容、中间 +% 内容、右半边内容。 +% \begin{macrocode} +\def\diagbox@triple#1#2#3#4{% + \begingroup + \diagbox@wd=\z@ + \diagbox@ht=\z@ + \diagbox@sepl=\tabcolsep + \diagbox@sepr=\tabcolsep + \def\diagbox@part{triple}% + \setkeys{diagbox}{dir=NW,#1}% + \@nameuse{diagbox@triple@setbox@\diagbox@dir}{#2}{#3}{#4}% +% \end{macrocode} +% 取长宽 +% \begin{macrocode} + \edef\xa{\strip@pt\wd\diagbox@boxa}% + \edef\ya{\strip@pt\dimexpr\ht\diagbox@boxa+\dp\diagbox@boxa\relax}% + \edef\xb{\strip@pt\wd\diagbox@boxb}% + \edef\yb{\strip@pt\dimexpr\ht\diagbox@boxb+\dp\diagbox@boxb\relax}% + \edef\xm{\strip@pt\wd\diagbox@boxm}% + \edef\ym{\strip@pt\dimexpr\ht\diagbox@boxm+\dp\diagbox@boxm\relax}% +% \end{macrocode} +% 列方程,求方程系数 +% \begin{macrocode} + \FPneg\bi\yb + \FPadd\ci\xb\xm \FPneg\ci\ci + \FPmul\di\xm\yb + \FPadd\bj\ya\ym \FPneg\bj\bj + \FPneg\cj\xa + \FPmul\dj\xa\ym +% \end{macrocode} +% 解方程 +% \begin{macrocode} + \FPsub\u\dj\di + \FPupn{v}{bj ci * bi cj * -}% + \FPupn{delta}{bi dj * bj di * - cj ci - * 4 * % + v u + copy * % + - 2 swap root}% + \ifdim\diagbox@wd=\z@ + \FPupn{x}{2 bj bi - delta v u - + / /}% + \diagbox@wd=\x\p@ + \else + \edef\x{\strip@pt\diagbox@wd}% + \fi + \ifdim\diagbox@ht=\z@ + \FPupn{y}{2 cj ci - delta v u + - / /}% + \diagbox@ht=\y\p@ + \else + \edef\y{\strip@pt\diagbox@ht}% + \fi + \FPsub\xxm\x\xm + \FPsub\yym\y\ym +% \end{macrocode} +% 画盒子 +% \begin{macrocode} + $\vcenter{\hbox{\diagbox@pict}}$% + \endgroup} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\diagbox} +% \changes{v2.0}{2011/11/22}{判断参数个数,选择两部分或三部分盒子。} +% 主要的用户命令。判断使用两部分还是三部分的盒子。 +% \begin{macrocode} +\newcommand\diagbox[3][]{% + \@ifnextchar\bgroup + {\diagbox@triple{#1}{#2}{#3}}{\diagbox@double{#1}{#2}{#3}}} +% \end{macrocode} +% \end{macro} +% % 以下代码用来模拟 \pkg{slashbox} 宏包的功能。 % % 禁止读入 \pkg{slashbox}。 @@ -375,7 +795,7 @@ % 模拟 "\slashbox"。 % \begin{macrocode} \def\slashbox{% - \def\diagbox@slashbox@options{dir=NE,}% + \def\diagbox@slashbox@options{dir=SW,}% \slashbox@} % \end{macrocode} % \end{macro} @@ -385,7 +805,7 @@ % 模拟 "\backslashbox"。 % \begin{macrocode} \def\backslashbox{% - \def\diagbox@slashbox@options{dir=SE,}% + \def\diagbox@slashbox@options{dir=NW,}% \slashbox@} % \end{macrocode} % \end{macro} |