我使用 Windows 作为操作系统并使用 TeXstudio 作为编辑器。
我的项目具有以下结构:
-project
-main.tex
-chapter1
-chapter1.tex
-bibgraf.bib
-figures
-listings
-chapter2
-chapter2.tex
-bibgraf.bib
-figures
-listings
我正在使用该subfiles
包来独立编译文档的各个章节。我想minted
在每个文件中使用该包来列出目录子目录chapterN.tex
中存在的代码。listings
chapterN
我不确定这是否真的可行minted
,因为根据我发现的情况,它似乎只能与根文档目录一起使用这里和这里。
目前,main.tex
使用chapter1/listing/pythonfile.py
within进行编译\inputminted
成功,但是当我编译时会产生错误chapter1.tex
。奇怪的是,chapter1.tex
使用进行编译./listing/pythonfile.py
对输出没有影响(编译似乎成功,但实际上我没有注意到 .pdf 输出有任何变化)。编辑:我发现由于某种原因,pdf 输出的自动更新不再起作用minted
,问题也观察到了这里。
这个问题有解决办法吗?如果没有,有没有其他方法minted
可以让我保持相同的项目结构(并且可能使用 matlab 和 python 代码得到很好的结果)?编辑:仍然存在的问题是,inputminted
在编译时我必须对命令main.tex
使用两个不同的参数chapter1.tex
。
以下是我的 MWE。
Main.tex
\providecommand{\main}{.}
\documentclass[11pt,reqno]{amsart}
\usepackage{subfiles}
\newcommand{\onlyinsubfile}[1]{#1}
\newcommand{\notinsubfile}[1]{}
\usepackage{float}
\usepackage{graphicx}
\def\biblio{\bibliographystyle{amsalpha}\bibliography{\main/bibgraf}} % *Modification: added `\main/` to specify relative file location.
\graphicspath{{\main/figures/}}
\usepackage[justification=centering]{caption} % Centred captions
% Typesetting code
\usepackage[newfloat]{minted}
\captionsetup[listing]{position=top}
\newenvironment{longlisting}{\captionsetup{type=listing}}{}
\begin{document}
\def\biblio{}
\renewcommand{\onlyinsubfile}[1]{}
\renewcommand{\notinsubfile}[1]{#1}
Hallo main
\subfile{chapter1/chapter1}
\bibliographystyle{amsalpha}
\bibliography{chapter1/bibgraf}
\end{document}
chapter1.tex
%!TeX root = chapter1
\providecommand{\main}{..}
\makeatletter
\def\input@path{{\main/}}
\makeatother
\documentclass[\main/main.tex]{subfiles}
\graphicspath{
{"\main/chapter1/figures/"}
{"\main/\main/chapter1/figures/"}
}
\begin{document}
%% my chapter 1 content
Hallo, this is a test:
\begin{equation}
\label{eq:sec1:1}
\int dx =0
\end{equation}
This is a figure test:
\begin{figure}[h]
\includegraphics[width=0.5\textwidth]{example.pdf}
\end{figure}
\onlyinsubfile{this only appears if chapter1.tex is compiled (not when main.tex is compiled)}
\notinsubfile{this only appears if main.tex is compiled (not when chapter1.tex is compiled)}
This is a reference test: \cite{anderson}
This is a listing test:
\begin{longlisting}
\caption{Source code of \texttt{pythonfile.py}, where the main classes are defined.}
\inputminted[frame=single,xleftmargin=\parindent,linenos,breaklines,breakafter=_(\{\[\]]{python}{./listings/pythonfile.py}
\end{longlisting}\vspace{2cm}
\onlyinsubfile{Call reference}
\biblio
%%
\end{document}
答案1
如果您使用该软件包的最新版本(v1.3 2019/09/28 或更高版本),则可以通过在序言中subfiles
定义命令来解决问题,如下所示:\subfix
\makeatletter
\newcommand\subfix[1]{\import@path#1}
\makeatother
然后,如果某些错误消息表明在错误的目录中搜索了文件,请将命令包装在文件名周围。例如,写入
\inputminted{python}{\subfix{./listings/pythonfile.py}}
而不仅仅是\inputminted{python}{./listings/pythonfile.py}
。
这是一个完整的示例,具有以下文件结构:
main.tex
sub/sub.tex
sub/listings/prime.py
其中文件包含以下内容:
% main.tex
\documentclass{article}
\usepackage{minted}
\makeatletter
\newcommand\subfix[1]{\import@path#1}
\makeatother
\usepackage{subfiles}
\begin{document}
\subfile{sub/sub}
\end{document}
% sub/sub.tex
\documentclass[../main]{subfiles}
\begin{document}
\inputminted{python}{\subfix{listings/prime.py}}
\end{document}
% sub/listings/prime.py
def prime(n):
if n < 2:
return False
for i in range(2,n):
if (n % i) == 0:
return False
return True
pdflatex -shell-escape main.tex
在主目录和pdflatex -shell-escape sub.tex
子目录中运行该命令分别sub
生成文件main.pdf
和sub/sub.pdf
,它们都类似于