From d77e8f45c9eba5dc5aca579a009a4cd78fbcbc54 Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Thu, 5 Apr 2018 10:12:24 -0700 Subject: LaTEX reader: properly resolve section numbers with \ref and chapters. Closes #4529. --- src/Text/Pandoc/Readers/LaTeX.hs | 8 +++++++- test/command/4529.md | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 test/command/4529.md diff --git a/src/Text/Pandoc/Readers/LaTeX.hs b/src/Text/Pandoc/Readers/LaTeX.hs index 52782653e..e1497dfb1 100644 --- a/src/Text/Pandoc/Readers/LaTeX.hs +++ b/src/Text/Pandoc/Readers/LaTeX.hs @@ -164,6 +164,7 @@ data LaTeXState = LaTeXState{ sOptions :: ReaderOptions , sInTableCell :: Bool , sLastHeaderNum :: HeaderNum , sLabels :: M.Map String [Inline] + , sHasChapters :: Bool , sToggles :: M.Map String Bool } deriving Show @@ -183,6 +184,7 @@ defaultLaTeXState = LaTeXState{ sOptions = def , sInTableCell = False , sLastHeaderNum = HeaderNum [] , sLabels = M.empty + , sHasChapters = False , sToggles = M.empty } @@ -1984,9 +1986,13 @@ section starred (ident, classes, kvs) lvl = do try (spaces >> controlSeq "label" >> spaces >> toksToString <$> braced) let classes' = if starred then "unnumbered" : classes else classes + when (lvl == 0) $ + updateState $ \st -> st{ sHasChapters = True } unless starred $ do hn <- sLastHeaderNum <$> getState - let num = incrementHeaderNum lvl hn + hasChapters <- sHasChapters <$> getState + let lvl' = lvl + if hasChapters then 1 else 0 + let num = incrementHeaderNum lvl' hn updateState $ \st -> st{ sLastHeaderNum = num } updateState $ \st -> st{ sLabels = M.insert lab [Str (renderHeaderNum num)] diff --git a/test/command/4529.md b/test/command/4529.md new file mode 100644 index 000000000..4a2125b9c --- /dev/null +++ b/test/command/4529.md @@ -0,0 +1,36 @@ +``` +% pandoc -f latex -t plain +\chapter{First chapter}\label{sec:chp1} +The next chapter is Chapter~\ref{sec:chp2}. +\section{First section}\label{sec:chp1sec1} +The next section is Section~\ref{sec:chp2sec1}. + +\chapter{Second chapter}\label{sec:chp2} +The previous chapter is Chapter~\ref{sec:chp1}. +\section{First section}\label{sec:chp2sec1} +The previous section is Section~\ref{sec:chp1sec1}. +^D + + +FIRST CHAPTER + + +The next chapter is Chapter 2. + + +First section + +The next section is Section 2.1. + + + +SECOND CHAPTER + + +The previous chapter is Chapter 1. + + +First section + +The previous section is Section 1.1. +``` -- cgit v1.2.3