我对 LaTeX 和 TeX 还不熟悉。到目前为止,我非常喜欢它为使我的文档功能化提供的各种可能性,例如能够使用参考资料显示内容另一部分的页码,或者能够自动在该部分的每一页上显示部分标题。
我也同意 LaTeX 的核心原则,即作者不应该负责格式化。我的日常工作是网络开发,样式和内容的分离是那里的主要做法。(CSS 与 HTML)
不幸的是,从我目前读到的内容来看,LaTeX 的真正原则似乎是没有人应该对格式负责,你应该接受 LaTeX 给你的任何格式。换句话说,LaTeX 的 .tex 文件似乎相当于 HTML,但我找不到相当于 CSS 的文件。
我知道你可以使用 .sty 文件来改变格式,但这些文件看起来笨重冗长,而且不太灵活。查看以下问题的答案这个问题似乎普遍的看法是 LaTeX 在这方面做得并不好。
例如,如果我想将网页中的所有标题都变成蓝色,我只需执行h1 { color: blue; }
,但在 LaTeX 中,我似乎必须完全覆盖标题的内置命令,重复所有现有功能才能更改一个属性。
我考虑过使用 HTML 和 CSS,因为我习惯使用它们,但它们根本不能很好地处理页面。(我不确定是否有可能做一些基本的事情,比如显示引用指向的页码)
那么,有没有支持更强大样式系统的 LaTeX 变体?(也许有一些不靠谱的 LaTeX 版本支持 CSS 样式表)或者有没有其他排版系统具有 LaTeX 所具有的页面感知功能。也许甚至有一个 HTML+CSS 渲染引擎可以实现这一点?或者也许我误解了一些基本的东西。
抱歉,这个问题比较菜鸟,我尝试做过研究,但我认为我的方法完全错误,因为我读到的资料都没有回答我的问题。
答案1
CSS 的对应物是 LaTeX 类 ( .cls
) 或包 ( .sty
) 文件。在 LaTeX 中,几乎可以将内容与表示完全分离,特别是如果您定义自己的命令。
不过,这两个系统之间存在一个重要区别。CSS 控制浏览器如何显示 HTML 页面的内容,并在输入文件和显示之间建立直接映射。您在浏览器中看到的内容是HTML 文件,但根据 CSS 规则显示。
相比之下,LaTeX 会解释输入文件中的排版命令以生成 DVI 或 PDF,这些 DVI 或 PDF 可能与输入文件的结构有很大不同,包括(正如 egreg 在评论中指出的那样)自动生成的文本,如目录、上下文敏感的引号、线条图等。LaTeX 似乎只是一种标记语言;实际上它是一种专门用于印刷排版的宏扩展语言。
使用 LaTeX 进行定制的可能性
在下面的示例中,我展示了通过更改类可以改变单个输入文件外观的大约 1%。这里我没有编写单独的类文件,而是使用类选项进行更改。
(请注意,我并不是说我所展示的东西在美学上是好的或代表了良好的编程实践!我没有尝试提供一个简单的例子。)
比较
彩虹标题是 LaTeX 和 CSS 之间比较的一个很好的例子:我不仅仅是像在 CSS 中那样设置文档元素的颜色属性,而且我实际上使用循环、条件、分支和递归来迭代标题的字母,增加计数器,从基于计数器的查找表中选择一种颜色,并用该颜色打印字母。
然而,输入文件不包含任何有关颜色的内容,并且使用不同的命令定义可以创建变量输出。
输出使用\documentclass[rainbowtitle]{example1}
:
输出使用\documentclass[palatino,notranslation]{example1}
:
输入文件:example.tex
\documentclass[rainbowtitle]{example1}
% Available class options:
% palatino -- use palatino fonts with different arrangement of styles
% notranslation -- hide the translation in poemtranslation environment
% rainbowtitle -- display the title in rainbow colors!
\title{Cascading Styles in \LaTeX}
\begin{document}
\maketitle
\section{Introduction}
This is an example of a \LaTeX{} file whose appearance can be changed drastically by using a different class.
\section{Custom Commands}
The difference between \code{article} and \code{memoir} classes is striking enough, not to mention \code{beamer}.
\keyword{Packages} or (in older terminology) style files can be used with multiple classes to change only one aspect, while the \keyword{class} file is more comprehensive, including packages.
\section{Custom Environments}
\begin{notabene}
Please note that this list is not exhaustive.
\end{notabene}
\begin{itemize}
\item \code{article}
\item \code{report}
\item \code{book}
\item \code{memoir}
\end{itemize}
Here is another example of a custom environment that can be completely redefined.
\begin{poemtranslation}
\begin{original}
Uno, dos, tres, cuatro, \eol
cinco, seis, siete, \eol
nuevo, diez.
\end{original}
\begin{translation}
One, two, three, four \eol
five, six, seven, \eol
eight, nine.
\end{translation}
\end{poemtranslation}
\end{document}
带有选项的类文件:example1.cls
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{example1}[2016/09/28 Example 1 of changeable formatting]
\LoadClass{article}
% Available class options:
% palatino -- use palatino fonts with different arrangement of styles
% notranslation -- hide the translation in poemtranslation environment
% rainbowtitle -- display the title in rainbow colors!
\newif\iftranslation
\translationtrue
\DeclareOption{notranslation}{\translationfalse}
\newif\ifpalatino
\palatinofalse
\DeclareOption{palatino}{\palatinotrue}
\newif\ifrainbowtitle
\rainbowtitlefalse
\DeclareOption{rainbowtitle}{\rainbowtitletrue}
\ProcessOptions\relax
\ifpalatino
% We can change all the font styles around with one switch.
\RequirePackage{newpxtext,newpxmath}
\let\textsf\textbf
\let\oldscshape\scshape
\let\scshape\itshape
\let\itshape\oldscshape
\else
\RequirePackage{Alegreya, AlegreyaSans}
\fi
\RequirePackage[T1]{fontenc}
\RequirePackage[utf8]{inputenc}
\RequirePackage{microtype}
% Compact lists
\RequirePackage{enumitem}
\setlist{noitemsep}
% We can change the section headings with one command
\RequirePackage{sectsty}
\allsectionsfont{\scshape\color{blue}}
% We can define custom commands and do anything we like with them.
% Some of these are redefined by the font switch above.
\RequirePackage{xparse}
\RequirePackage{xcolor}
\NewDocumentCommand{\code}{}{\textsf}
% Rainbowtitle option puts each letter of title in different
% rainbow color
\ifrainbowtitle
\def\scando{}
\def\scan#1{\scanA#1\end} % thanks to wipet for this code
\def\scanA#1{\ifx\end#1\else\scando#1\expandafter\scanA\fi}
\newcount\rainbowcolor
\def\spectrum#1{%
\textcolor{\getcolor{\the\rainbowcolor}}{#1}\thinspace
\ifnum\rainbowcolor > 4
\rainbowcolor=0
\else
\advance\rainbowcolor by 1
\fi
}
\def\getcolor#1{\ifcase#1 red\or orange\or yellow\or green\or blue\or violet\fi}
\def\rainbow#1{%
\rainbowcolor=0
\let\scando\spectrum
\expandafter\expandafter\scan{#1}
}
\RenewDocumentCommand{\maketitle}{}{%
\begin{center}
\Huge \rainbow{\@title}
\end{center}
\bigskip
}
\fi
% Fancy underlining
\RequirePackage{ulem}
\NewDocumentCommand{\keyword}{ m }{\textcolor{magenta}{\uwave{#1}}}
% Redefinable environment, including font style and spacing
\NewDocumentEnvironment{notabene}{}
{\itshape}
{\par\addvspace{2ex}}
% Another customizable environment, for parallel poetic text and translation
% With one switch we can turn off one of the columns
\RequirePackage[spanish,english]{babel}
\RequirePackage{multicol}
\iftranslation
\NewDocumentEnvironment{poemtranslation}{}
{\footnotesize\raggedright
\begin{multicols}{2}}
{\end{multicols}}
\NewDocumentEnvironment{original}{}
{\selectlanguage{spanish}
\color{red}
\begin{verse}}
{\end{verse}}
\NewDocumentEnvironment{translation}{}
{\columnbreak
\color{blue}
\begin{verse}}
{\end{verse}}
\else
\NewDocumentEnvironment{poemtranslation}{}
{\color{violet}}
{}
\NewDocumentEnvironment{original}{}
{\selectlanguage{spanish}
\begin{verse}}
{\end{verse}}
\RequirePackage{environ}
\NewEnviron{translation}{}[]
\fi
% This could be redefined to, say, `&` if you wanted to use reledmac/reledpar.
\NewDocumentCommand{\eol}{}{\\}
\endinput