我发表过很多科学期刊的文章,其中一些对手稿的页数要求非常严格,通常文章的最终版本是双栏的,但对于审查和诸如此类的东西,编译为单栏总是很容易。
我的问题是,有没有办法只编译一个 .tex 文件并得到单列 pdf 和双列 pdf?
我读到这可以通过使用来实现\write18
,但我完全不明白如何
我想一定是这样的:
\documentclass[layout=onecolumn]{SomeJournalStyle}
all the preamble
\write18{pdflatex "2Columnversion" Master.tex some script/modifier to change column layout at preamble }
\begin{document}
.
.
.
.
.
\end{document}
答案1
我建议您使用命令行选项来指定列类型。因此,下面的 MWE 可以使用以下两种类型之一:
pdflatex doc.tex
或者
pdflatex "\def\ColumnType{onecolumn}\input{doc.tex}"
将产生单列布局,但
pdflatex "\def\ColumnType{twocolumn}\input{doc.tex}"
将产生两列输出。
代码:
\ifdefined\ColumnType
\else
\def\ColumnType{onecolumn}
\fi
\documentclass[\ColumnType]{article}
\usepackage{lipsum}
\begin{document}
\lipsum[1-5]
\end{document}
答案2
这arara
自动化工具可以帮助实现 Peter Grill 提出的想法的自动化他的回答。
您只需将以下arara
规则保存到知道可以找到它的onetwocolumns.yaml
目录中arara
,然后就可以运行
arara myfile
在以下文件上,您将收到两个 pdf:
myfileONECOLUMN.pdf
myfileTWOCOLUMN.pdf
指令arara
在规则文件中详细说明,但为了清楚起见,您可以按照以下任一方式使用它们:
% arara: onetwocolumns
% arara: onetwocolumns: {columns: onecolumn}
默认值columns
是twocolumn
,但您可以根据需要进行更改。
myfile.tex
% arara: onetwocolumns
% arara: onetwocolumns: {columns: onecolumn}
\ifdefined\ColumnType
\else
\def\ColumnType{onecolumn}
\fi
\documentclass[\ColumnType]{article}
\usepackage{lipsum}
\begin{document}
\lipsum[1-5]
\end{document}
onetwocolumns.yaml
!config
# Make one and two column document
# author: Chris Hughes
# last edited by: cmh, April 26th, 2014
# https://tex.stackexchange.com/questions/173532/two-pdf-versions-from-one-single-tex-file
# requires arara 3.0+
#
# Sample usage
#
# % arara: onetwocolumns
# % arara: onetwocolumns: {columns: onecolumn}
# % arara: onetwocolumns: {columns: twocolumn}
#
identifier: onetwocolumns
name: OneTwoColumns
commands:
- <arara> pdflatex "\def\ColumnType{@{columns}}\input{@{file}}"
- <arara> @{ isWindows( "cmd /c move", "mv" ) } @{getBasename(file)}.pdf @{getBasename(file)}@{columns.toUpperCase()}.pdf
arguments:
- identifier: columns
flag: <arara> @{parameters.columns}
default: twocolumn
答案3
我经常使用 Peter Grill 的解决方案来解决此类问题,但有时我会这样做:一个“内容”文件,然后是两个“外壳”文件。当两个文件中的内容格式存在很大差异时,我发现这样做更方便。(这可以通过条件语句轻松实现,但有时我最终还是选择了这条路线……)
“内容”文件非常简单
% content.tex
This is the file that has all the actual content
shell 文件包含所有格式指令
% shell-1col.tex
\documentclass{article}
\usepackage{...}
% other specific stuff for the one-column layout
\begin{document}
\input{content}
\end{document}
(如果两个 shell 文件有很多重叠,那么将所有内容包装在一个.sty
都包含的文件中可能是明智之举)
% shell-2col.tex
\documentclass[twocolumn]{article}
\usepackage{...}
% other specific stuff for the two-column layout
\begin{document}
\input{content}
\end{document}
编译也很简单:
for f in shell-1col.tex shell-2col.tex ; do latex $f ; done
至于哪个更好,条件路线还是两个单独的文件路线,我怀疑这取决于许多因素。我的建议是两种都试一下。
答案4
为了实现其他评论中建议的内容 - 即使用\input
将文档内容读入可能使用不同样式的各种“shell”文档,我最终做了一些额外的事情。我有一个通用文件,其中包含许多 LaTeX 项目中使用的有用命令。例如,您可能想要定义可以插入摘要的命令。
对于条件格式,你可能还想使用类似如果不是。最后,我建议将公共文件放在子目录中,并将每个“shell 文件”项目(例如带有 的文件\documentclass
)放在自己的目录中。有关此结构的更多信息,请参阅嵌套 \input 中的外部文件路径和如何包含由文本和宏连接指定的目录中的文件?。