From: "Игорь Пашев" <pashev.igor-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: pandoc-discuss <pandoc-discuss-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
Subject: LaTeX: parse thebibliography (patch)
Date: Thu, 13 Jan 2022 09:58:06 -0800 (PST) [thread overview]
Message-ID: <415779ca-0946-47b5-b15e-a82c2d99d168n@googlegroups.com> (raw)
[-- Attachment #1.1: Type: text/plain, Size: 654 bytes --]
Here is a patch which makes Pandoc parse the bibliography environment into
a definition list. The patch includes a test showing the result.
I needed it for myself for self-contained LaTeX documents and hope somebody
may find it useful too.
--
You received this message because you are subscribed to the Google Groups "pandoc-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To view this discussion on the web visit https://groups.google.com/d/msgid/pandoc-discuss/415779ca-0946-47b5-b15e-a82c2d99d168n%40googlegroups.com.
[-- Attachment #1.2: Type: text/html, Size: 980 bytes --]
[-- Attachment #2: thebibliography.patch --]
[-- Type: text/x-patch, Size: 4881 bytes --]
From 12cce1758ff82cced76fa1961076f99176ea2689 Mon Sep 17 00:00:00 2001
From: Igor Pashev <pashev.igor-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Date: Thu, 13 Jan 2022 19:11:50 +0200
Subject: LaTeX: parse thebibliography
---
src/Text/Pandoc/Readers/LaTeX.hs | 32 +++++++++++++++++++++
src/Text/Pandoc/Readers/LaTeX/Parsing.hs | 2 ++
test/command/latex-thebibliography.md | 48 ++++++++++++++++++++++++++++++++
3 files changed, 82 insertions(+)
create mode 100644 test/command/latex-thebibliography.md
diff --git a/src/Text/Pandoc/Readers/LaTeX.hs b/src/Text/Pandoc/Readers/LaTeX.hs
index 20a2db76b..e4a3aaa58 100644
--- a/src/Text/Pandoc/Readers/LaTeX.hs
+++ b/src/Text/Pandoc/Readers/LaTeX.hs
@@ -741,6 +741,14 @@ looseItem = do
skipopts
return mempty
+looseBibItem :: PandocMonad m => LP m Blocks
+looseBibItem = do
+ inListItem <- sInListItem <$> getState
+ guard $ not inListItem
+ skipopts
+ void braced
+ return mempty
+
epigraph :: PandocMonad m => LP m Blocks
epigraph = do
p1 <- grouped block
@@ -886,6 +894,7 @@ blockCommands = M.fromList
, ("strut", pure mempty)
, ("rule", rule)
, ("item", looseItem)
+ , ("bibitem", looseBibItem)
, ("documentclass", skipopts *> braced *> preamble)
, ("centerline", para . trimInlines <$> (skipopts *> tok))
, ("caption", mempty <$ setCaption inline)
@@ -975,6 +984,7 @@ environments = M.union (tableEnvironments blocks inline) $
, ("togglefalse", braced >>= setToggle False)
, ("iftoggle", try $ ifToggle >> block)
, ("CSLReferences", braced >> braced >> env "CSLReferences" blocks)
+ , ("thebibliography", theBibliography)
]
filecontents :: PandocMonad m => LP m Blocks
@@ -1211,6 +1221,28 @@ descItem = do
bs <- blocks
return (ils, [bs])
+bibItem :: PandocMonad m => LP m (Inlines, [Blocks])
+bibItem = do
+ blocks
+ controlSeq "bibitem"
+ sp
+ lbl <- opt <|> nextCite
+ cite_key <- untokenize <$> braced
+ bs <- blocks
+ return (lbl, [divWith (cite_key, [], []) bs])
+ where
+ nextCite = do
+ st <- getState
+ let n = sTheBibItemNum st + 1
+ setState st {sTheBibItemNum = n}
+ return . singleton . Str . T.pack . show $ n
+
+theBibliography :: PandocMonad m => LP m Blocks
+theBibliography =
+ divWith ("", ["thebibliography"], []) . definitionList <$>
+ listenv "thebibliography" (many bibItem)
+
+
listenv :: PandocMonad m => Text -> LP m a -> LP m a
listenv name p = try $ do
oldInListItem <- sInListItem `fmap` getState
diff --git a/src/Text/Pandoc/Readers/LaTeX/Parsing.hs b/src/Text/Pandoc/Readers/LaTeX/Parsing.hs
index 9eb4a0cbc..8fb6bd5bc 100644
--- a/src/Text/Pandoc/Readers/LaTeX/Parsing.hs
+++ b/src/Text/Pandoc/Readers/LaTeX/Parsing.hs
@@ -172,6 +172,7 @@ data LaTeXState = LaTeXState{ sOptions :: ReaderOptions
, sFileContents :: M.Map Text Text
, sEnableWithRaw :: Bool
, sRawTokens :: IntMap.IntMap [Tok]
+ , sTheBibItemNum :: Int
}
deriving Show
@@ -199,6 +200,7 @@ defaultLaTeXState = LaTeXState{ sOptions = def
, sFileContents = M.empty
, sEnableWithRaw = True
, sRawTokens = IntMap.empty
+ , sTheBibItemNum = 0
}
instance PandocMonad m => HasQuoteContext LaTeXState m where
diff --git a/test/command/latex-thebibliography.md b/test/command/latex-thebibliography.md
new file mode 100644
index 000000000..153fbfc13
--- /dev/null
+++ b/test/command/latex-thebibliography.md
@@ -0,0 +1,48 @@
+# The bibliography
+
+```
+% pandoc -f latex -t native
+\begin{thebibliography}{100}
+ \bibitem[One1990]{one} The First.
+ \bibitem{two} The Second.
+ \bibitem[Three 1998]{three} The Third.
+ \bibitem{four} The Fourth.
+\end{thebibliography}
+^D
+[ Div
+ ( "" , [ "thebibliography" ] , [] )
+ [ DefinitionList
+ [ ( [ Str "One1990" ]
+ , [ [ Div
+ ( "one" , [] , [] )
+ [ Para [ Str "The" , Space , Str "First." ] ]
+ ]
+ ]
+ )
+ , ( [ Str "1" ]
+ , [ [ Div
+ ( "two" , [] , [] )
+ [ Para [ Str "The" , Space , Str "Second." ] ]
+ ]
+ ]
+ )
+ , ( [ Str "Three" , Space , Str "1998" ]
+ , [ [ Div
+ ( "three" , [] , [] )
+ [ Para [ Str "The" , Space , Str "Third." ] ]
+ ]
+ ]
+ )
+ , ( [ Str "2" ]
+ , [ [ Div
+ ( "four" , [] , [] )
+ [ Para [ Str "The" , Space , Str "Fourth." ] ]
+ ]
+ ]
+ )
+ ]
+ ]
+]
+
+```
+
next reply other threads:[~2022-01-13 17:58 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-13 17:58 Игорь Пашев [this message]
[not found] ` <415779ca-0946-47b5-b15e-a82c2d99d168n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2022-01-16 18:59 ` Игорь Пашев
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=415779ca-0946-47b5-b15e-a82c2d99d168n@googlegroups.com \
--to=pashev.igor-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
--cc=pandoc-discuss-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).