myfile.tex

myfile.tex

我发表过很多科学期刊的文章,其中一些对手稿的页数要求非常严格,通常文章的最终版本是双栏的,但对于审查和诸如此类的东西,编译为单栏总是很容易。

我的问题是,有没有办法只编译一个 .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}

默认值columnstwocolumn,但您可以根据需要进行更改。

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 中的外部文件路径如何包含由文本和宏连接指定的目录中的文件?

相关内容