diff --git a/packages/myst-cli/src/build/utils/collectExportOptions.ts b/packages/myst-cli/src/build/utils/collectExportOptions.ts index dd96bec75..47fb9e3b3 100644 --- a/packages/myst-cli/src/build/utils/collectExportOptions.ts +++ b/packages/myst-cli/src/build/utils/collectExportOptions.ts @@ -174,9 +174,13 @@ export function resolveArticles( const { articles, sub_articles } = exp; projectPath = projectPath ?? '.'; let resolved: ResolvedArticles = { articles, sub_articles }; - // First, respect explicit toc. If articles/sub_articles are already defined, toc is ignored. - if (exp.toc && !resolved.articles && !resolved.sub_articles) { - resolved = resolveArticlesFromTOC(session, exp, projectPath, vfile); + // First, respect explicit toc or toc file. If articles/sub_articles are already defined, toc is ignored. + if (!resolved.articles && !resolved.sub_articles) { + if (exp.toc) { + resolved = resolveArticlesFromTOC(session, exp, projectPath, vfile); + } else if (exp.tocFile && validateSphinxTOC(session, exp.tocFile)) { + resolved = resolveArticlesFromSphinxTOC(session, exp, exp.tocFile, vfile); + } } // If no articles are specified, use the sourceFile for article if (!resolved.articles && SOURCE_EXTENSIONS.includes(path.extname(sourceFile))) { diff --git a/packages/myst-frontmatter/src/exports/exports.yml b/packages/myst-frontmatter/src/exports/exports.yml index d30ac7962..2454d8282 100644 --- a/packages/myst-frontmatter/src/exports/exports.yml +++ b/packages/myst-frontmatter/src/exports/exports.yml @@ -401,6 +401,15 @@ cases: - format: pdf toc: - file: foo.md + - title: export toc as string coerces to tocFile + raw: + exports: + - format: pdf + toc: _toc.yml + normalized: + exports: + - format: pdf + tocFile: _toc.yml - title: export toc and article errors raw: exports: @@ -414,6 +423,18 @@ cases: articles: - file: a.md errors: 1 + - title: export toc file and article errors + raw: + exports: + - format: pdf + toc: _toc.yml + article: a.md + normalized: + exports: + - format: pdf + articles: + - file: a.md + errors: 1 - title: export toc and sub_article errors raw: exports: diff --git a/packages/myst-frontmatter/src/exports/types.ts b/packages/myst-frontmatter/src/exports/types.ts index b494a49b1..508779315 100644 --- a/packages/myst-frontmatter/src/exports/types.ts +++ b/packages/myst-frontmatter/src/exports/types.ts @@ -30,4 +30,6 @@ export type Export = { /** sub_articles are only for jats xml export */ sub_articles?: string[]; /** MECA: to, from later */ + /** tocFile is not set by user; it will be set instead of `toc` when user provides a string for `toc`*/ + tocFile?: string; } & Record; diff --git a/packages/myst-frontmatter/src/exports/validators.ts b/packages/myst-frontmatter/src/exports/validators.ts index 0c486b39f..87c481469 100644 --- a/packages/myst-frontmatter/src/exports/validators.ts +++ b/packages/myst-frontmatter/src/exports/validators.ts @@ -264,10 +264,14 @@ export function validateExport(input: any, opts: ValidationOptions): Export | un const tocOpts = incrementOptions('toc', opts); if (validExport.articles || validExport.sub_articles) { validationError( - 'export cannot define both toc file and articles/sub_articles; ignoring toc', + 'export cannot define both toc and articles/sub_articles; ignoring toc', tocOpts, ); validExport.toc = undefined; + } else if (typeof value.toc === 'string') { + // Support legacy behavior of providing a jupyterbook toc file as export.toc + validExport.tocFile = value.toc; + validExport.toc = undefined; } else { validExport.toc = validateTOC(value.toc, tocOpts); } diff --git a/packages/mystmd/tests/multi-page-toc-tex/three.md b/packages/mystmd/tests/multi-page-toc-tex/three.md index 7c5be0642..220e55eba 100644 --- a/packages/mystmd/tests/multi-page-toc-tex/three.md +++ b/packages/mystmd/tests/multi-page-toc-tex/three.md @@ -1,3 +1,11 @@ +--- +exports: + - format: tex + template: ../templates/tex + output: _build/out-from-toc.tex + toc: _toc.yml +--- + # Page Three Egestas sed tempus urna et pharetra pharetra. Quam elementum pulvinar etiam non. Aliquet lectus proin nibh nisl condimentum. Nulla facilisi cras fermentum odio eu feugiat pretium nibh ipsum. Sit amet facilisis magna etiam tempor orci eu lobortis elementum. Non diam phasellus vestibulum lorem sed risus ultricies tristique. Non curabitur gravida arcu ac tortor dignissim convallis aenean. Felis eget nunc lobortis mattis aliquam. Proin libero nunc consequat interdum varius sit amet mattis. Volutpat sed cras ornare arcu dui vivamus arcu. Elit pellentesque habitant morbi tristique senectus et netus. Nibh tortor id aliquet lectus proin nibh. Lacinia at quis risus sed vulputate odio ut enim blandit. Quis enim lobortis scelerisque fermentum dui faucibus in ornare. diff --git a/packages/mystmd/tests/outputs/multi-page-tex-from-toc.tex b/packages/mystmd/tests/outputs/multi-page-tex-from-toc.tex new file mode 100644 index 000000000..3a4cc5bef --- /dev/null +++ b/packages/mystmd/tests/outputs/multi-page-tex-from-toc.tex @@ -0,0 +1,68 @@ +\documentclass[a4paper,11pt,oneside]{book} +\usepackage[top=2cm, bottom=2cm, left=2cm, right=2cm]{geometry} +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage{lmodern} +\usepackage{hyperref} +\usepackage{graphicx} +\usepackage{caption} +\usepackage{natbib} +\bibliographystyle{abbrvnat} + +% Make list items more compact +\usepackage{enumitem} +\setlist[itemize]{noitemsep, topsep=0pt} + + + +% Style quotes +\usepackage{xcolor} +% Change links to basic +\hypersetup{ + colorlinks, + linkcolor={black}, + citecolor={black}, + % urlcolor={blue!80!black} + urlcolor={black} +} +\usepackage{framed} +\definecolor{quoteshade}{rgb}{0.95,0.95,1} +\renewenvironment{quote}{% + \def\FrameCommand{% + \hspace{1pt}% + {\color{darkblue}\vrule width 2pt}% + {\color{quoteshade}\vrule width 4pt}% + \colorbox{quoteshade}% + }% + \MakeFramed{\advance\hsize-\width\FrameRestore} + \noindent\hspace{-8pt}% disable indenting first paragraph + \begin{adjustwidth} + \vspace{2pt}\vspace{2pt}% +} +{% + \vspace{2pt}\end{adjustwidth}\endMakeFramed% +} + +\title{\Huge \textbf{Page Three}} +\author{\textsc{Franklin Koch}} + +\begin{document} +\sloppy + +\frontmatter +\maketitle + +\tableofcontents +% \listoffigures +% \listoftables + +\mainmatter + +% \include{preface.tex} +% \include{acknowledgements.tex} + +Egestas sed tempus urna et pharetra pharetra. Quam elementum pulvinar etiam non. Aliquet lectus proin nibh nisl condimentum. Nulla facilisi cras fermentum odio eu feugiat pretium nibh ipsum. Sit amet facilisis magna etiam tempor orci eu lobortis elementum. Non diam phasellus vestibulum lorem sed risus ultricies tristique. Non curabitur gravida arcu ac tortor dignissim convallis aenean. Felis eget nunc lobortis mattis aliquam. Proin libero nunc consequat interdum varius sit amet mattis. Volutpat sed cras ornare arcu dui vivamus arcu. Elit pellentesque habitant morbi tristique senectus et netus. Nibh tortor id aliquet lectus proin nibh. Lacinia at quis risus sed vulputate odio ut enim blandit. Quis enim lobortis scelerisque fermentum dui faucibus in ornare. + + + +\end{document}