ConTeXt 更类似于 CSS

ConTeXt 更类似于 CSS

最近我重新开始使用 LaTeX 写作,探索了 XeTeX 并发现了使用现代字体的进步,探索了 LuaTeX 并发现正在进行下一代开发,探索了 ConTeXt 并发现......专注于格式化?

对我来说,LaTeX 及其变体始终致力于将内容与格式分开。这就是我们使用 LaTeX 的原因,\begin{abstract} ... \end{abstract}并且不必担心其排版方式。我们时不时地想要调整设置,但就我个人而言,我发现这种情况很少发生。

但在阅读有关 ConTeXt 及其使用方法的文章时,我发现了以下文章这是关于文档标题的教你如何格式化标题页,这在 LaTeX 中很简单。本文建议编写 60 行格式化代码并将其放入单独的模块中,以便实现类似的效果。

我禁不住觉得自己错过了 ConTeXt 背后的哲学。项目页面除了说它是一个“文档处理系统”之外,并没有明确说明。它还说“ConTeXt 文档是在没有格式化的情况下编写的”,这并不完全正确,因为我刚开始学习(例如,参见上面的文章)。

有人能解释一下使用 ConTeXt 时应该采取的心态吗?我在使用这个排版系统时是否需要提供大量的格式说明?

答案1

ConTeXt 还注重内容和演示的分离。在我编写的所有 ConTeXt 文档中,我都使用:

\setvariables
    [metadata]
    [
      title=...,
      author=...,
      affiliation=...,
      date=...,
    ]

它给出了一个漂亮的文档标题,设置了 PDF 文件的相应字段(使用hyperrefLaTeX 中的包可以做到这一点),我有标记 metadata:title并且metadata:author可以在页眉和页脚中使用。与 LaTeX 类似。不同之处在于,执行此操作的宏不是由 ConTeXt 提供的,而是由我编写的。

ConTeXt 没有提供类似默认实现的原因在于,\maketitle不可能找到适合所有人的解决方案。书籍、文章、报告等标题中包含的信息各不相同。因此,ConTeXt 让文档作者自行创建排版标题的命令,只要他们认为合适即可。ConTeXt 提供了足够多的高级命令,因此用户可以相对轻松地创建复杂的宏。

LaTeX 采用了不同的方法。它为 提供了默认实现\maketitlearticle.cls其中定义为:

  \if@titlepage
  \newcommand\maketitle{\begin{titlepage}%
  \let\footnotesize\small
  \let\footnoterule\relax
  \let \footnote \thanks
  \null\vfil
  \vskip 60\p@
  \begin{center}%
    {\LARGE \@title \par}%
    \vskip 3em%
    {\large
     \lineskip .75em%
      \begin{tabular}[t]{c}%
        \@author
      \end{tabular}\par}%
      \vskip 1.5em%
    {\large \@date \par}%       % Set date in \large size.
  \end{center}\par
  \@thanks
  \vfil\null
  \end{titlepage}%
  \setcounter{footnote}{0}%
  \global\let\thanks\relax
  \global\let\maketitle\relax
  \global\let\@thanks\@empty
  \global\let\@author\@empty
  \global\let\@date\@empty
  \global\let\@title\@empty
  \global\let\title\relax
  \global\let\author\relax
  \global\let\date\relax
  \global\let\and\relax
}
\else
\newcommand\maketitle{\par
  \begingroup
    \renewcommand\thefootnote{\@fnsymbol\c@footnote}%
    \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}%
    \long\def\@makefntext##1{\parindent 1em\noindent
            \hb@[email protected]{%
                \hss\@textsuperscript{\normalfont\@thefnmark}}##1}%
    \if@twocolumn
      \ifnum \col@number=\@ne
        \@maketitle
      \else
        \twocolumn[\@maketitle]%
      \fi
    \else
      \newpage
      \global\@topnum\z@   % Prevents figures from going at top of page.
      \@maketitle
    \fi
    \thispagestyle{plain}\@thanks
  \endgroup
  \setcounter{footnote}{0}%
  \global\let\thanks\relax
  \global\let\maketitle\relax
  \global\let\@maketitle\relax
  \global\let\@thanks\@empty
  \global\let\@author\@empty
  \global\let\@date\@empty
  \global\let\@title\@empty
  \global\let\title\relax
  \global\let\author\relax
  \global\let\date\relax
  \global\let\and\relax
}
\def\@maketitle{%
  \newpage
  \null
  \vskip 2em%
  \begin{center}%
  \let \footnote \thanks
    {\LARGE \@title \par}%
    \vskip 1.5em%
    {\large
      \lineskip .5em%
      \begin{tabular}[t]{c}%
        \@author
      \end{tabular}\par}%
    \vskip 1em%
    {\large \@date}%
  \end{center}%
  \par
  \vskip 1.5em}
\fi

其他文档类根据需要重新定义它。例如,scrartcl.cls(Koma Script)将其定义为:

\newcommand*\maketitle[1][1]{%
  \expandafter\ifnum \csname scr@[email protected]\endcsname>\scr@compatibility\relax
  \else
    \def\and{%
      \end{tabular}%
      \hskip 1em \@plus.17fil%
      \begin{tabular}[t]{c}%
    }%
  \fi
  \if@titlepage
    \begin{titlepage}
      \setcounter{page}{%
        #1%
      }%
      \if@titlepageiscoverpage
        \edef\titlepage@restore{%
          \noexpand\endgroup
          \noexpand\global\noexpand\@colht\the\@colht
          \noexpand\global\noexpand\@colroom\the\@colroom
          \noexpand\global\vsize\the\vsize
          \noexpand\global\noexpand\@titlepageiscoverpagefalse
          \noexpand\let\noexpand\titlepage@restore\noexpand\relax
        }%
        \begingroup
        \topmargin=\dimexpr \coverpagetopmargin-1in\relax
        \oddsidemargin=\dimexpr \coverpageleftmargin-1in\relax
        \evensidemargin=\dimexpr \coverpageleftmargin-1in\relax
        \textwidth=\dimexpr
        \paperwidth-\coverpageleftmargin-\coverpagerightmargin\relax
        \textheight=\dimexpr
        \paperheight-\coverpagetopmargin-\coverpagebottommargin\relax
        \headheight=0pt
        \headsep=0pt
        \footskip=\baselineskip
        \@colht=\textheight
        \@colroom=\textheight
        \vsize=\textheight
        \columnwidth=\textwidth
        \hsize=\columnwidth
        \linewidth=\hsize
      \else
        \let\titlepage@restore\relax
      \fi
      \let\footnotesize\small
      \let\footnoterule\relax
      \let\footnote\thanks
      \renewcommand*\thefootnote{\@fnsymbol\c@footnote}%
      \let\@oldmakefnmark\@makefnmark
      \renewcommand*{\@makefnmark}{\rlap\@oldmakefnmark}%
      \ifx\@extratitle\@empty \else
        \noindent\@extratitle\next@tdpage
      \fi
      \setparsizes{\z@}{\z@}{\z@\@plus 1fil}\par@updaterelative
      \ifx\@titlehead\@empty \else
        \begin{minipage}[t]{\textwidth}%
          \usekomafont{titlehead}{\@titlehead\par}%
        \end{minipage}\par
      \fi
      \null\vfill
      \begin{center}
        \ifx\@subject\@empty \else
          {\usekomafont{subject}{\@subject\par}}%
          \vskip 3em
        \fi
        {\usekomafont{title}{\huge \@title\par}}%
        \vskip 1em
        {\ifx\@subtitle\@empty\else\usekomafont{subtitle}{\@subtitle\par}\fi}%
        \vskip 2em
        {%
          \usekomafont{author}{%
            \lineskip 0.75em
            \begin{tabular}[t]{c}
              \@author
            \end{tabular}\par
          }%
        }%
        \vskip 1.5em
        {\usekomafont{date}{\@date \par}}%
        \vskip \z@ \@plus3fill
        {\usekomafont{publishers}{\@publishers \par}}%
        \vskip 3em
      \end{center}\par
      \@thanks\let\@thanks\@empty
      \vfill\null
      \if@twoside
        \@tempswatrue
        \expandafter\ifnum \@nameuse{scr@[email protected]}>\scr@compatibility\relax
        \else
          \ifx\@uppertitleback\@empty\ifx\@lowertitleback\@empty
            \@tempswafalse
          \fi\fi
        \fi
        \if@tempswa
          \next@tpage
          \begin{minipage}[t]{\textwidth}
            \@uppertitleback
          \end{minipage}\par
          \vfill
          \begin{minipage}[b]{\textwidth}
            \@lowertitleback
          \end{minipage}\par
          \@thanks\let\@thanks\@empty
        \fi
      \fi
      \ifx\@dedication\@empty
      \else
        \next@tdpage\null\vfill
        {\centering\usekomafont{dedication}{\@dedication \par}}%
        \vskip \z@ \@plus3fill
        \@thanks\let\@thanks\@empty
        \cleardoubleemptypage
      \fi
      \ifx\titlepage@restore\relax\else\clearpage\titlepage@restore\fi
    \end{titlepage}
  \else
    \par
    \@tempcnta=%
    #1%
    \relax\ifnum\@tempcnta=1\else
      \ClassWarning{\KOMAClassName}{%
        Optional argument of \string\maketitle\space ignored
        at\MessageBreak
        notitlepage-mode%
      }%
    \fi
    \begingroup
      \let\titlepage@restore\relax
      \renewcommand*\thefootnote{\@fnsymbol\c@footnote}%
      \let\@oldmakefnmark\@makefnmark
      \renewcommand*{\@makefnmark}{\rlap\@oldmakefnmark}
      \next@tdpage
      \if@twocolumn
        \ifnum \col@number=\@ne
          \@makeextratitle
          \next@tdpage
          \@maketitle
        \else
          \ifx\@extratitle\@empty\else
            \twocolumn[\@makeextratitle]\next@tdpage
          \fi
          \twocolumn[\@maketitle]%
        \fi
      \else
        \@makeextratitle
        \@maketitle
      \fi
      \thispagestyle{\titlepagestyle}\@thanks
    \endgroup
  \fi
  \setcounter{footnote}{0}%
  \expandafter\ifnum \csname scr@[email protected]\endcsname>\scr@compatibility\relax
    \let\thanks\relax
    \let\maketitle\relax
    \let\@maketitle\relax
    \global\let\@thanks\@empty
    \global\let\@author\@empty
    \global\let\@date\@empty
    \global\let\@title\@empty
    \global\let\@subtitle\@empty
    \global\let\@extratitle\@empty
    \global\let\@titlehead\@empty
    \global\let\@subject\@empty
    \global\let\@publishers\@empty
    \global\let\@uppertitleback\@empty
    \global\let\@lowertitleback\@empty
    \global\let\@dedication\@empty
    \global\let\author\relax
    \global\let\title\relax
    \global\let\extratitle\relax
    \global\let\titlehead\relax
    \global\let\subject\relax
    \global\let\publishers\relax
    \global\let\uppertitleback\relax
    \global\let\lowertitleback\relax
    \global\let\dedication\relax
    \global\let\date\relax
  \fi
  \global\let\and\relax
}%

请注意,Koma Script 添加了其他关键字,例如dedication,,publisher这些关键字不是由artcle类提供的。有人可能会问,为什么只有这些额外的关键字?如果我需要其他关键字怎么办?

请注意ConTeXt 维基文档标题的实现与 LaTeX 实现非常相似。它也是可配置的。例如,我可以使用:

\setuptitle
    [
      authorstyle=italic,
      titlecolor=blue,
    ]

它将以蓝色排版标题,以斜体字体排版作者。Koma Script 类提供了附加命令(因此也提供了附加代码行)来提供这种灵活性。

项目页面没有明确说明,只是说它是一个“文档处理系统”。它还说“ConTeXt 文档是在没有格式化的情况下编写的”,这并不完全正确,因为我刚开始学习(例如,参见上面的文章)。

在文档准备方面,LaTeX 和 ConTeXt 非常相似;两者都使用高级标记,并假设样式文件可用于处理格式。不同之处在于,LaTeX 假设准备文档的用户与创建样式文件的用户不同;因此,很少提供高级命令来调整默认样式。ConTeXt 假设准备文档的用户与创建样式文件的用户相同;并提供高级命令来调整默认样式。

另一个区别是文化。LaTeX 社区发布了很多软件包;但 ConTeXt 社区发布的软件包相对较少。例如,如果 ConTeXt wiki 中的文档标题代码作为 ConTeXt 软件包发布,您就不会抱怨。

答案2

有人可以解释一下使用 ConTeXt 时应该采取的心态吗?

“我要写一份结构化的文档。如果我想设计它的样式,或者添加一种新的语义元素,或者两者兼而有之,那将很容易。”

例如,你的文档可能有以下概念:重要章节,其样式应与正常部分类似,但是颜色为红色。

\definehead[importantsection][section][color=red]  % styling

\importantsection{Pay Attention Now, Dougal}  % semantic/structural markup

在使用该排版系统时,我是否需要提供详尽的格式说明?

不——就像 LaTeX 一样,默认设置看起来不错。但如果你添加样式很容易。许多用户认为这是一个优点,这就是为什么许多示例都以它为特色。

您在网上看到如此多格式化代码的另一个原因是 ConTeXt 已经内置了许多功能,并且它被设计为允许自定义。因此,使用 LaTeX 时,人们可能会回答“这个包可以做你想做的事”,而使用 ConTeXt 时,人们更常说“这些内置命令可以做你想做的事”;因此,文化更注重掌握 ConTeXt 的功能,而不是构建包来扩展它。

ConTeXt 确实默认不包含摘要环境。但是\definenarrower[abstract]plus真的和plus有\startabstract...\stopabstract那么大区别吗?\usepackage{amsmath}\begin{cases}...\end{cases}

关于哲学的最后一点说明。

ConTeXt 并不专注于格式化费用结构标记——它侧重于格式化结构标记,就像 Plain TeX 和 LaTeX 一样。这三种语言都提供了美观的默认样式;ConTeXt 可以非常轻松地更改该样式。但 ConTeXt 和 LaTeX 一样,核心是结构标记。

答案3

ConTeXt 更类似于 CSS

我个人(也许是有争议的)观点是语境更类似于CSS这就是我更喜欢它而不是 LaTeX 的原因。只有当需要非常具体的 LaTeX 类(例如信件或简历)时,我才会使用 LaTeX。

此外,ConTeXt 还具有“含电池”那么你拯救自己免于 LaTeX 包含/包地狱。

ConTeXt 的典型用法是从定义文档元素的外观开始的,就在之前\starttext。这样,ConTeXt 实现了内容和风格之间的明确区分,类似于推荐的 CSS 使用。这也是我现在使用 ConTeXt 的方式;作为一个模板语言为了潘多克,实际内容写在Markdown

这就是说,许多官方的例子都给出了康特花园具有误导性展示了内联格式化命令的广泛可能性。这不是典型的 ConTeXt 用法,可能会让人皱眉,就像人们不喜欢使用内联 CSS 样式的 HTML 页面一样,如下所示:

 <h1 style="color:blue;margin-left:30px;">This is a heading.</h1>

最后,与 LaTeX 不同的是,无需运行 ConTeXt 三次以便获得包含正确目录、参考文献和索引的最终版本。ConTeXt 第一次运行就正确了!

答案4

两种心态,而不只是一种!

“我是一名专业出版商,而不是科学期刊编辑或科学文章作者。我可以轻松地将设计师的概念转化为可排版的模板,并为作者提供一套简单的文本结构规则,易于遵循。”

或者

“我是一名排版艺术家。我可以随时随地访问我作品的所有排版方面。我可以使用可编程排版界面来获得标准排版解决方案无法实现的结果”

相关内容