[LyX/master] DocBook: for books only, create a preface around the first few elements so that the result is valid.

Thibaut Cuvelier tcuvelier at lyx.org
Sun Feb 14 04:17:12 UTC 2021


commit ac98f21f8c442a06752758eb0fb8ecd77fc28e97
Author: Thibaut Cuvelier <tcuvelier at lyx.org>
Date:   Sun Feb 14 05:20:26 2021 +0100

    DocBook: for books only, create a preface around the first few elements so that the result is valid.
    
    Books can only contain parts and chapters, not single sections or text after the abstract.
---
 autotests/export/docbook/book_preface.lyx |  312 +++++++++++++++++++++++++++++
 autotests/export/docbook/book_preface.xml |   29 +++
 src/output_docbook.cpp                    |   57 ++++++
 3 files changed, 398 insertions(+), 0 deletions(-)

diff --git a/autotests/export/docbook/book_preface.lyx b/autotests/export/docbook/book_preface.lyx
new file mode 100644
index 0000000..a96db19
--- /dev/null
+++ b/autotests/export/docbook/book_preface.lyx
@@ -0,0 +1,312 @@
+#LyX 2.4 created this file. For more info see https://www.lyx.org/
+\lyxformat 606
+\begin_document
+\begin_header
+\save_transient_properties true
+\origin unavailable
+\textclass book
+\begin_preamble
+\date{Janvier 2021}
+
+
+%espacement horizontal contrôlé TDM/TOC empêche chevauchement
+\usepackage{tocloft}
+\setlength{\cftfignumwidth}{3.5em}
+\cftsetindents{section}{0em}{2.8em}
+\cftsetindents{subsection}{2.4em}{3.7em}
+
+%
+\usepackage{xcolor}
+\colorlet{BLUE}{blue}
+
+%liens en gris TDM/TDF/TDT + hyperlien + citations biblio
+\hypersetup{urlcolor=gray}
+\hypersetup{linkcolor=gray}
+\hypersetup{citecolor=gray}
+
+% ???
+\usepackage{alltt}
+\usepackage{upquote}
+\newcommand{\nospace}[1]{\texttt{#1}}
+
+% faire apparaître les chapitres*
+\let\newchapter\chapter
+\long\def\chapter{\addtocontents{toc}{\penalty-3000}\newchapter}
+
+\usepackage{newtxmath}
+
+% tableau dans encadré TeX
+\usepackage{tabularx}
+
+
+
+% évite la numérotation des pages vides et met le numérotation i, ii, iii, iv, etc
+% pour les pages avant les chapitres (numérotés arabian)
+\usepackage{emptypage}
+\usepackage{etoolbox}
+% Fixing the appearance of the footer in the empty pages in between chapters.
+\let\origdoublepage\cleardoublepage
+\renewcommand{\cleardoublepage}{%
+  \clearpage
+  {\pagestyle{empty}\origdoublepage}%
+}
+% Finished fixing appearance
+
+% empêche que les pages incomplètes incorporent des espaces verticaux
+\raggedbottom
+
+% citations comme [1-4] au lieu de [1,2,3,4]
+\usepackage{cite}
+
+% pour l'index
+\usepackage{latexsym}
+\usepackage{textgreek}
+
+% séparation texte / notes de bas de page si page pas pleine
+%\addtolength{\skip\footins}{5pt} 
+\usepackage[bottom]{footmisc}
+\end_preamble
+\use_default_options true
+\begin_modules
+theorems-ams
+eqs-within-sections
+figs-within-sections
+\end_modules
+\maintain_unincluded_children no
+\language french
+\language_package default
+\inputencoding auto-legacy
+\fontencoding auto
+\font_roman "times" "default"
+\font_sans "default" "default"
+\font_typewriter "default" "default"
+\font_math "auto" "auto"
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_roman_osf false
+\font_sans_osf false
+\font_typewriter_osf false
+\font_sf_scale 100 100
+\font_tt_scale 100 100
+\use_microtype false
+\use_dash_ligatures true
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref true
+\pdf_bookmarks true
+\pdf_bookmarksnumbered true
+\pdf_bookmarksopen false
+\pdf_bookmarksopenlevel 1
+\pdf_breaklinks true
+\pdf_pdfborder true
+\pdf_colorlinks true
+\pdf_backref false
+\pdf_pdfusetitle true
+\papersize b5
+\use_geometry false
+\use_package amsmath 1
+\use_package amssymb 1
+\use_package cancel 1
+\use_package esint 1
+\use_package mathdots 1
+\use_package mathtools 1
+\use_package mhchem 1
+\use_package stackrel 1
+\use_package stmaryrd 1
+\use_package undertilde 1
+\cite_engine basic
+\cite_engine_type default
+\biblio_style plain
+\use_bibtopic false
+\use_indices true
+\paperorientation portrait
+\suppress_date false
+\justification true
+\use_refstyle 1
+\use_minted 0
+\use_lineno 0
+\backgroundcolor #ffffff
+\fontcolor #000000
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\index Index des fonctions extrinsèques
+\shortcut ind
+\color #008000
+\end_index
+\paperwidth 175cm
+\paperheight 240mm
+\secnumdepth 2
+\tocdepth 2
+\paragraph_separation indent
+\paragraph_indentation default
+\is_math_indent 0
+\math_numbering_side default
+\quotes_style swiss
+\dynamic_quotes 0
+\papercolumns 1
+\papersides 2
+\paperpagestyle headings
+\tablestyle default
+\tracking_changes false
+\output_changes false
+\change_bars false
+\postpone_fragile_content false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\docbook_table_output 0
+\end_header
+
+\begin_body
+
+\begin_layout Title
+
+\series bold
+\noun on
+Think Julia
+\end_layout
+
+\begin_layout Chapter*
+Droits associés à la version française
+\end_layout
+
+\begin_layout Standard
+En vertu de la licence Creative Commons (
+\begin_inset CommandInset href
+LatexCommand href
+name "CC BY-NC-SA 3.0 FR"
+target "https://creativecommons.org/licenses/by-nc-sa/3.0/fr/"
+literal "false"
+
+\end_inset
+
+; 
+\emph on
+Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions
+ 3.0 FR
+\emph default
+), vous êtes autorisé à partager (copier, distribuer et communiquer le matériel
+ par tous moyens et sous tous formats) et adapter (remixer, transformer
+ et créer à partir du matériel) selon les conditions suivantes:
+\end_layout
+
+\begin_layout Itemize
+
+\emph on
+Attribution
+\emph default
+ — Vous devez créditer le document, intégrer un lien vers la licence (en
+ l'occurrence: 
+\begin_inset CommandInset href
+LatexCommand href
+name "CC BY-NC-SA 3.0 FR"
+target "https://creativecommons.org/licenses/by-nc-sa/3.0/fr/legalcode"
+literal "false"
+
+\end_inset
+
+) et indiquer si des modifications ont été effectuées au document.
+ Vous devez indiquer ces informations par tous les moyens raisonnables,
+ sans toutefois suggérer que le présent auteur vous soutient ou soutient
+ la façon dont vous avez utilisé son travail.
+ 
+\end_layout
+
+\begin_layout Itemize
+
+\emph on
+Pas d’utilisation commerciale
+\emph default
+ — Vous n'êtes pas autorisé à faire un usage commercial du présent document,
+ tout ou partie du matériel le composant.
+ 
+\end_layout
+
+\begin_layout Itemize
+
+\emph on
+Partage dans les mêmes conditions — 
+\emph default
+Dans le cas où vous effectuez un remix, que vous transformez, ou créez à
+ partir du matériel composant le document original, vous devez diffuser
+ le document modifié dans les mêmes conditions, c'est-à-dire avec la même
+ licence avec laquelle le document original a été diffusé.
+ 
+\end_layout
+
+\begin_layout Standard
+Vous n'êtes pas autorisé à appliquer des conditions légales ou des mesures
+ techniques qui restreindraient légalement autrui à utiliser le document
+ dans les conditions décrites par la 
+\begin_inset CommandInset href
+LatexCommand href
+name "licence"
+target "https://creativecommons.org/licenses/by-nc-sa/3.0/fr/legalcode"
+literal "false"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Chapter
+\begin_inset CommandInset label
+LatexCommand label
+name "chap:Mode-de-fonctionnement"
+
+\end_inset
+
+Mode de fonctionnement d'un programme
+\end_layout
+
+\begin_layout Standard
+Le but de ce livre est d'apprendre au lecteur à penser comme un informaticien.
+ Cette façon de penser combine certaines des meilleures caractéristiques
+ des mathématiques, de l'ingénierie et des sciences naturelles.
+ Comme les mathématiciens, les informaticiens utilisent des langages formels
+ pour expliciter des idées (en particulier les calculs).
+ Tout comme les ingénieurs, ils conçoivent des structures, assemblent des
+ composants dans divers systèmes et évaluent le meilleur compromis entre
+ différentes possibilités.
+ Comme les scientifiques, ils observent le comportement de systèmes complexes,
+ formulent des hypothèses et vérifient leurs prédictions.
+\end_layout
+
+\begin_layout Standard
+La compétence la plus importante pour un informaticien est la résolution
+ de problèmes, c'est-à-dire la capacité à formuler ces problèmes, à penser
+ de manière créative aux solutions et à exprimer la meilleure solution de
+ manière claire et précise.
+ Il s'avère que le processus d'apprentissage de la programmation est une
+ excellente occasion de mettre en pratique les compétences nécessaires à
+ la résolution de problèmes.
+ C'est pourquoi ce chapitre s'intitule 
+\begin_inset Quotes cld
+\end_inset
+
+ Mode de fonctionnement d'un programme 
+\begin_inset Quotes crd
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+À un certain niveau, le lecteur apprendra à programmer, une compétence utile
+ en soi.
+ À un autre niveau, la programmation pourra être exploitée comme un moyen
+ d'atteindre un but.
+ Au fur et à mesure, cette fin deviendra plus claire.
+ 
+\end_layout
+
+\end_body
+\end_document
diff --git a/autotests/export/docbook/book_preface.xml b/autotests/export/docbook/book_preface.xml
new file mode 100644
index 0000000..d1e09bd
--- /dev/null
+++ b/autotests/export/docbook/book_preface.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This DocBook file was created by LyX 2.4.0dev
+  See https://www.lyx.org/ for more information -->
+<book xml:lang="fr_FR" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xi="http://www.w3.org/2001/XInclude" version="5.2">
+<title><personname><emphasis role='bold'>Think Julia</emphasis></personname></title>
+<preface>
+<title>Preface</title>
+<bridgehead renderas='other' otherrenderas='chapter'>Droits associés à la version française</bridgehead>
+<para>En vertu de la licence Creative Commons (<link xlink:href="https://creativecommons.org/licenses/by-nc-sa/3.0/fr/">CC BY-NC-SA 3.0 FR</link>; <emphasis>Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 FR</emphasis>), vous êtes autorisé à partager (copier, distribuer et communiquer le matériel par tous moyens et sous tous formats) et adapter (remixer, transformer et créer à partir du matériel) selon les conditions suivantes:</para>
+<itemizedlist>
+<listitem>
+<para><emphasis>Attribution</emphasis> — Vous devez créditer le document, intégrer un lien vers la licence (en l'occurrence: <link xlink:href="https://creativecommons.org/licenses/by-nc-sa/3.0/fr/legalcode">CC BY-NC-SA 3.0 FR</link>) et indiquer si des modifications ont été effectuées au document. Vous devez indiquer ces informations par tous les moyens raisonnables, sans toutefois suggérer que le présent auteur vous soutient ou soutient la façon dont vous avez utilisé son travail. </para>
+</listitem>
+<listitem>
+<para><emphasis>Pas d’utilisation commerciale</emphasis> — Vous n'êtes pas autorisé à faire un usage commercial du présent document, tout ou partie du matériel le composant. </para>
+</listitem>
+<listitem>
+<para><emphasis>Partage dans les mêmes conditions —</emphasis> Dans le cas où vous effectuez un remix, que vous transformez, ou créez à partir du matériel composant le document original, vous devez diffuser le document modifié dans les mêmes conditions, c'est-à-dire avec la même licence avec laquelle le document original a été diffusé. </para>
+</listitem>
+</itemizedlist>
+<para>Vous n'êtes pas autorisé à appliquer des conditions légales ou des mesures techniques qui restreindraient légalement autrui à utiliser le document dans les conditions décrites par la <link xlink:href="https://creativecommons.org/licenses/by-nc-sa/3.0/fr/legalcode">licence</link>.</para>
+</preface>
+<chapter xml:id="chap.Mode-de-fonctionnement">
+<title>Mode de fonctionnement d'un programme</title>
+<para>Le but de ce livre est d'apprendre au lecteur à penser comme un informaticien. Cette façon de penser combine certaines des meilleures caractéristiques des mathématiques, de l'ingénierie et des sciences naturelles. Comme les mathématiciens, les informaticiens utilisent des langages formels pour expliciter des idées (en particulier les calculs). Tout comme les ingénieurs, ils conçoivent des structures, assemblent des composants dans divers systèmes et évaluent le meilleur compromis entre différentes possibilités. Comme les scientifiques, ils observent le comportement de systèmes complexes, formulent des hypothèses et vérifient leurs prédictions.</para>
+<para>La compétence la plus importante pour un informaticien est la résolution de problèmes, c'est-à-dire la capacité à formuler ces problèmes, à penser de manière créative aux solutions et à exprimer la meilleure solution de manière claire et précise. Il s'avère que le processus d'apprentissage de la programmation est une excellente occasion de mettre en pratique les compétences nécessaires à la résolution de problèmes. C'est pourquoi ce chapitre s'intitule «&#x2009; Mode de fonctionnement d'un programme &#x2009;».</para>
+<para>À un certain niveau, le lecteur apprendra à programmer, une compétence utile en soi. À un autre niveau, la programmation pourra être exploitée comme un moyen d'atteindre un but. Au fur et à mesure, cette fin deviendra plus claire. </para>
+</chapter>
+</book>
\ No newline at end of file
diff --git a/src/output_docbook.cpp b/src/output_docbook.cpp
index ce6b702..f3ac018 100644
--- a/src/output_docbook.cpp
+++ b/src/output_docbook.cpp
@@ -1102,6 +1102,63 @@ void docbookParagraphs(Text const &text,
 	outputDocBookInfo(text, buf, xs, runparams, paragraphs, info);
 	bpit = info.epit;
 
+	// In the specific case of books, there must be parts or chapters. In some cases, star sections are used at the
+	// beginning for many things like acknowledgements or licenses. DocBook has tags for many of these cases, but not
+	// the LyX layouts... Gather everything in a <preface>, that's the closest in meaning.
+	// This is only useful if the things after the <info> tag are not already parts or chapters!
+	if (buf.params().documentClass().docbookroot() == "book") {
+	    // Check the condition on the first few elements.
+	    bool hasPreface = false;
+	    pit_type pref_bpit = bpit;
+	    pit_type pref_epit = bpit + 1;
+
+	    static const std::set<std::string> allowedElements = {
+	            // List from https://tdg.docbook.org/tdg/5.2/book.html
+	            "acknowledgements", "appendix", "article", "bibliography", "chapter", "colophon", "dedication",
+	            "glossary", "index", "part", "preface", "reference", "toc"
+	    };
+
+	    for (; pref_epit <= epit; ++pref_epit) {
+            auto par = text.paragraphs().iterator_at(pref_epit);
+            if (allowedElements.find(par->layout().docbooktag()) != allowedElements.end() ||
+                    allowedElements.find(par->layout().docbooksectiontag()) != allowedElements.end())
+                break;
+
+            hasPreface = true;
+	    }
+
+	    // Output a preface if required. A title is needed for the document to be valid...
+	    if (hasPreface) {
+	        xs << xml::StartTag("preface");
+	        xs << xml::CR();
+
+	        xs << xml::StartTag("title");
+	        xs << "Preface";
+	        xs << xml::EndTag("title");
+            xs << xml::CR();
+
+            auto pref_par = text.paragraphs().iterator_at(pref_bpit);
+            auto pref_end = text.paragraphs().iterator_at(pref_epit);
+            while (pref_par != pref_end) {
+                // Skip paragraphs not producing any output.
+                if (hasOnlyNotes(*pref_par)) {
+                    ++pref_par;
+                    continue;
+                }
+
+                // TODO: must sections be handled here? If so, it might be useful to extract the corresponding loop
+                // in the rest of this function to use the same here (and avoid copy-paste mistakes).
+                pref_par = makeAny(text, buf, xs, runparams, pref_par);
+            }
+
+	        xs << xml::EndTag("preface");
+            xs << xml::CR();
+
+            // Skip what has just been generated in the preface.
+            bpit = pref_epit;
+	    }
+	}
+
 	std::stack<std::pair<int, string>> headerLevels; // Used to determine when to open/close sections: store the depth
 	// of the section and the tag that was used to open it.
 


More information about the lyx-cvs mailing list