在子文件中使用 minted 列出子目录中的代码

在子文件中使用 minted 列出子目录中的代码

我使用 Windows 作为操作系统并使用 TeXstudio 作为编辑器。

我的项目具有以下结构:

-project
    -main.tex
    -chapter1
        -chapter1.tex
        -bibgraf.bib
        -figures
        -listings
    -chapter2
        -chapter2.tex
        -bibgraf.bib
        -figures
        -listings

我正在使用该subfiles包来独立编译文档的各个章节。我想minted在每个文件中使用该包来列出目录子目录chapterN.tex中存在的代码。listingschapterN

我不确定这是否真的可行minted,因为根据我发现的情况,它似乎只能与根文档目录一起使用这里这里

目前,main.tex使用chapter1/listing/pythonfile.pywithin进行编译\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.pdfsub/sub.pdf,它们都类似于

在此处输入图片描述

相关内容