diff options
| author | John MacFarlane <[email protected]> | 2024-02-18 11:44:03 -0800 |
|---|---|---|
| committer | John MacFarlane <[email protected]> | 2024-02-18 11:44:03 -0800 |
| commit | b36052144b3fe49077ad70c6bd54d4747a4c0d03 (patch) | |
| tree | 3838a4fb7f7d652f2d4cf0ec9dc6840ad850608a | |
| parent | 8d63ed444901d0c5ef675788dbd90ea99e2f494c (diff) | |
LaTeX writer: fix bug when a language is specified in two different ways.
If you used `lang: de-DE` but then had a span or div with `lang=de`, the
preamble would try to load `ngerman` twice, leading to an error.
This fix ensures that a language is only loaded once.
Closes #9472.
| -rw-r--r-- | src/Text/Pandoc/Writers/LaTeX.hs | 8 | ||||
| -rw-r--r-- | test/command/9472.md | 85 |
2 files changed, 90 insertions, 3 deletions
diff --git a/src/Text/Pandoc/Writers/LaTeX.hs b/src/Text/Pandoc/Writers/LaTeX.hs index 9eb7be4f6..2c3404310 100644 --- a/src/Text/Pandoc/Writers/LaTeX.hs +++ b/src/Text/Pandoc/Writers/LaTeX.hs @@ -175,7 +175,6 @@ pandocToLaTeX options (Pandoc meta blocks) = do titleMeta <- stringToLaTeX TextString $ stringify $ docTitle meta authorsMeta <- mapM (stringToLaTeX TextString . stringify) $ docAuthors meta -- we need a default here since lang is used in template conditionals - let otherLangs = [l | l <- docLangs, mblang /= Just l] let hasStringValue x = isJust (getField x metadata :: Maybe (Doc Text)) let geometryFromMargins = mconcat $ intersperse ("," :: Doc Text) $ mapMaybe (\(x,y) -> @@ -251,15 +250,18 @@ pandocToLaTeX options (Pandoc meta blocks) = do -> resetField "papersize" ("a" <> ds) _ -> id) metadata + let babelLang = mblang >>= toBabel let context' = -- note: lang is used in some conditionals in the template, -- so we need to set it if we have any babel/polyglossia: maybe id (\l -> defField "lang" (literal $ renderLang l)) mblang $ maybe id (\l -> defField "babel-lang" - (literal l)) (mblang >>= toBabel) + (literal l)) babelLang $ defField "babel-otherlangs" - (map literal $ mapMaybe toBabel otherLangs) + (map literal + (nubOrd . catMaybes . filter (/= babelLang) + $ map toBabel docLangs)) $ defField "latex-dir-rtl" ((render Nothing <$> getField "dir" context) == Just ("rtl" :: Text)) context diff --git a/test/command/9472.md b/test/command/9472.md new file mode 100644 index 000000000..48fec385d --- /dev/null +++ b/test/command/9472.md @@ -0,0 +1,85 @@ +``` +% pandoc -t latex -s +--- +lang: de-DE +--- + +More text in English. ['Zitat auf Deutsch.']{lang=de} + +[Bonjour]{lang=fr} [café]{lang="fr-FR"} +^D +% Options for packages loaded elsewhere +\PassOptionsToPackage{unicode}{hyperref} +\PassOptionsToPackage{hyphens}{url} +% +\documentclass[ +]{article} +\usepackage{amsmath,amssymb} +\usepackage{iftex} +\ifPDFTeX + \usepackage[T1]{fontenc} + \usepackage[utf8]{inputenc} + \usepackage{textcomp} % provide euro and other symbols +\else % if luatex or xetex + \usepackage{unicode-math} % this also loads fontspec + \defaultfontfeatures{Scale=MatchLowercase} + \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1} +\fi +\usepackage{lmodern} +\ifPDFTeX\else + % xetex/luatex font selection +\fi +% Use upquote if available, for straight quotes in verbatim environments +\IfFileExists{upquote.sty}{\usepackage{upquote}}{} +\IfFileExists{microtype.sty}{% use microtype if available + \usepackage[]{microtype} + \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts +}{} +\makeatletter +\@ifundefined{KOMAClassName}{% if non-KOMA class + \IfFileExists{parskip.sty}{% + \usepackage{parskip} + }{% else + \setlength{\parindent}{0pt} + \setlength{\parskip}{6pt plus 2pt minus 1pt}} +}{% if KOMA class + \KOMAoptions{parskip=half}} +\makeatother +\usepackage{xcolor} +\setlength{\emergencystretch}{3em} % prevent overfull lines +\providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} +\setcounter{secnumdepth}{-\maxdimen} % remove section numbering +\ifLuaTeX +\usepackage[bidi=basic]{babel} +\else +\usepackage[bidi=default]{babel} +\fi +\babelprovide[main,import]{ngerman} +\babelprovide[import]{french} +% get rid of language-specific shorthands (see #6817): +\let\LanguageShortHands\languageshorthands +\def\languageshorthands#1{} +\ifLuaTeX + \usepackage{selnolig} % disable illegal ligatures +\fi +\usepackage{bookmark} +\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available +\urlstyle{same} +\hypersetup{ + pdflang={de-DE}, + hidelinks, + pdfcreator={LaTeX via pandoc}} + +\author{} +\date{} + +\begin{document} + +More text in English. \foreignlanguage{ngerman}{`Zitat auf Deutsch.'} + +\foreignlanguage{french}{Bonjour} \foreignlanguage{french}{café} + +\end{document} + +``` |
