LaTeX多文件编译的方法总结

LaTeX多文件编译的方法总结

在编写LaTeX文档的时候,由于文档的section较多,或者section的编写时间各不相同,我们可能碰到如下问题:

1、由于想分开编写各个section

2、preamble太多,想专门弄一个文件放preamble

3、想用bibtex来生成参考文献

我分别参考了这个几个网页:111 222,再结合自己的上手体会,给出下面这个(还凑合的)解决方案。

我们首先建立一个文件夹“project”,在下面分别创建“main.tex”文件“sections”文件夹。在“main.tex”里面写入:

\documentclass[fleqn]{article}

\usepackage{subfiles}
\usepackage{D:/My_Preamble} %必须是绝对路径,才能让各个section*.tex在单独编译时使用到

\title{This is title}
\author{Jay Chou}
\date{\today}

\begin{document}

\maketitle

Hello World!

\subfile{sections/section1}

\subfile{sections/section2}

\bibliographystyle{unsrt}
\bibliography{D:/My_Reference} %必须是绝对路径。但各个section*.tex单独编译时使用不到(这是一个缺点)
\end{document}

“section1.tex”文件这样编写,并放到“sections”文件夹里:

\documentclass[../main.tex]{subfiles} %两个点代表返回上一级菜单

\newcommand{\AAA}{\textbf{abcdefg}} % 这个‘\AAA‘命令只在这个tex文件里起作用

\begin{document}

%From there on, type whatever you want.
\section{This is section 1}

Hello, this is section 1.
\end{document} 

其他的section的tex文件照着这个格式写就行了。“My_preamble.sty”文件如下编写,并放到D盘目录下:

\ProvidesPackage{msqmypreamble}

\usepackage{amsmath, amssymb, amsthm}
\usepackage{cite}
%\usepackage{graphicx, graphics} % Allows including images
% etc% etc% etc

%\setlength{\voffset}{-2.0cm}
%\setlength{\parskip}{0.2cm}
\newtheorem{thm}{Theorem} \setcounter{thm}{0}
\newcommand{\defn}{\overset{\Delta}{=}}\newcommand{\st}{\textrm{~s.t.~}}\newcommand{\supp}{\mathop{\rm supp}}% etc% etc% etc

现在,把各个section共同的preamble都写到“My_Preamble.sty”文件中,然后将这个文件放到一个路径下,然后在“main.tex”文件中像4行那样使用这个sty。为什么必须是绝对路径,这是为了让之后的各个“section*.tex”文件也能找到这个文件在哪,从而使用里面的命令。  在各个“section*.tex”文件中,你可以再附加一个本section独有的preamble,就想第三行的“\AAA”那样。但这个“\AAA”只能在本tex文件中使用。

然后是bibtex。各个“section*.tex”在单独编译的时候无法找到参考文件,及时在“main.tex”中bib文件的路径是绝对路径。这算是一个小瑕疵(很惭愧)。将bib文件单独拿出来放在一个地方的作用是使得每次收集bibtex信息可以集中在一起。

之后,我们可以编译这个“main.tex”文件,得到包含各个section的总文件,也可以单独编译各个“section*.tex”文件,并且各个“section*.tex”文件可以使用My_Preamble这个preamble,很方便。但不足之处是,单独编译各个“section*.tex”文件时,若文件中应用了bib文件中的条目,输出结果是显示不出来的,之后在编译总文件时才能正确显示。

关于label的引用:各个“section*.tex”内部最好不要使用同名的label标号(例如 \label{eq:1} ),使用相同的标号会冲突的。同时,各个“section*.tex”之间可以相互应用对方的标号,当编译“main.tex”时,这些相互引用的标号就会显示出来(单独编译某个“section*.tex”显示不出来)。

最后是这个“subfiles.sty”文件,它的内容如下:

%% This is file `subfiles.sty‘,
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% subfiles.dtx  (with options: `package‘)
%%
%% Copyright 2002 Federico Garcia
%%
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{subfiles}[2002/06/08 Federico Garcia]
\DeclareOption*{\PackageWarning{\CurrentOption ignored}}
\ProcessOptions
\RequirePackage{verbatim}
\newcommand{\[email protected]}{%
    \let\document\relax\let\enddocument\relax%
    \newenvironment{document}{}{}%
    \renewcommand{\documentclass}[2][subfiles]{}}
\newcommand\subfile[1]{\begingroup\[email protected]\input{#1}\endgroup}
\endinput
%%
%% End of file `subfiles.sty‘.

创建个txt文件,把如上代码复制进去,然后把txt文件的文件名改为“subfiles.sty”,放到装“main.tex”的文件就可以使用了。

写了这么多,应该能 +1s 吧,蛤蛤蛤!

【转载】http://www.cnblogs.com/mashiqi

时间: 2024-08-08 22:10:03

LaTeX多文件编译的方法总结的相关文章

C语言-------多文件编译

(1)前段时间,学长讲解宏的一些知识  也提起了那个多文件编译,同过看别人的博客,自己也懂了一些,现在来总结一下这个多文件编译,其实和java里面的那个class的调用好像有联系 其定义即可以理解成:就是属于不同的C语言名字下,例如helo.c  还有  hell.c  这两个文件,然后互相调用彼此的函数,这就是自己理解的多文件编译: 下面是你编写完函数后,怎么调用函数得常规做法,在C-free下面编译的 1 #include<stdio.h> 2 #include<stdlib.h&g

OC方法和文件编译

一.OC方法 (一)对象方法 (1)对象方法以-开头如 -(void)xx; (2)对象方法只能又对象来调用 (3)对象方法中可以访问当前对象的成员变量 (4)调用格式   [对象名  对象方法名]: (5)设计一个学生类和狗类,练习对象方法的使用. 学生类的声明: 学生类的实现: 狗类的声明: 狗类的实现: 主程序: (二)类方法 (1)类方法以+开头  如+(void)put; (2)类方法只能由类来调用 (3)类方法中不能访问实例(成员)变量,因为类方法又类来调用,并没有创建存储空间来存储

Objective-C语言-方法和文件编译

OC方法和文件编译 一.OC方法 (一)对象方法 (1)对象方法以-开头如 -(void)xx; (2)对象方法只能又对象来调用 (3)对象方法中可以访问当前对象的成员变量 (4)调用格式   [对象名  对象方法名]: (5)设计一个学生类和狗类,练习对象方法的使用. 学生类的声明: 学生类的实现: 狗类的声明: 狗类的实现: 主程序: (二)类方法 (1)类方法以+开头  如+(void)put; (2)类方法只能由类来调用 (3)类方法中不能访问实例(成员)变量,因为类方法又类来调用,并没

Linux内核驱动将多个C文件编译成一个ko文件的方法——每个C文件里都有module_init与module_exit

以两个C文件为例: 将本该被分别编译成adc_device.ko和adc_driver.ko的adc_device.c.adc_driver.c编译成一个ko文件! 采用方法: 第一步.修改C文件 1.去掉adc_device.c文件里module_init(xxx).module_exit(yyy)中xxx.yyy 函数原型的关键字static 2.注销adc_device.c文件里module_init(xxx).module_exit(yyy)函数 3.在adc_driver.c文件里添加

反编译class文件并重新编译的方法

在没有.java源码的情况下,如果想修改一个.class文件.可以通过以下步骤实现: 修改前的class文件: 一.反编译.class文件成.java文件. 1.可以使用Java Decompiler这个工具,直接打开对应的.class文件.然后点击菜单:File→Save Source,将文件保存成.java文件.如下: PS:Java Decompiler工具还可以用来反编译jar包,有时候需要了解下jar包里的代码实现,如果开发工具里看不到,可以直接用Java Decompiler打开ja

使用AS编译jni文件无法编译出arm64-v8a,x86_64和mips64平台的.so文件的解决方法

我用的插件版本是:classpath 'com.android.tools.build:gradle-experimental:0.4.0',AS集成和使用ndk编译项目参考官方demo:https://github.com/googlesamples/android-ndk 正常情况下配置下图所示即可编译指定平台的.so文件 但是如果你也出现以下问题(即无法编译出arm64-v8a,x86_64和mips64平台的.so文件) 其实原因很简单,那是因为compileSdkVersion太低了,

简单的反编译class文件并重新编译的方法

在没有.java源码的情况下,如果想修改一个.class文件.可以通过以下步骤实现: 修改前的class文件: 一.反编译.class文件成.java文件. 1.可以使用Java Decompiler这个工具,直接打开对应的.class文件.然后点击菜单:File→Save Source,将文件保存成.java文件.如下: PS:Java Decompiler工具还可以用来反编译jar包,有时候需要了解下jar包里的代码实现,如果开发工具里看不到,可以直接用Java Decompiler打开ja

多文件程序编译时头文件的使用方法

如果把main函数放在第一个文件中,而把自定义函数放在第二个文件中,那就是需要在一个文件中声明函数原型如果把函数原型包含在一个头文件里,那么每次使用函数的时候就不用声明其原型了 把函数声明放在头文件里,是很好的习惯 #ifndef是预编译指令,代表如果没有定义一个常量,那么就欲编译下面的代码 #ifdef是预编译指令,代表如果定义了一个常量,那么就欲编译下面的代码 #ifdef  宏 代码 #endif .c文件 放函数的定义 .h 文件 放函数的声明 多文件编译时,头文件的写法 #ifndef

Python 文件编译为字节码的方法

一般情况下 python 不需要手动编译字节码.但是如果不想直接 release 源代码给其他人,将文件编译成字节码,可以实现一定程度的信息隐藏. 1) 使用模块 py_compile 编译一个单文件 import py_compile py_compile.compile('./demo.py') 2) 使用模块 compileall 递归的编译一个文件包 import compileall compileall.compile_dir('./test') 3) 使用模块 compileall