public inbox archive for pandoc-discuss@googlegroups.com
 help / color / mirror / Atom feed
From: Julien Dutant <julien.dutant-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: pandoc-discuss <pandoc-discuss-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
Subject: Re: Lua filter to change macro for figure caption md -> latex
Date: Tue, 5 Dec 2023 08:09:19 -0800 (PST)	[thread overview]
Message-ID: <f3fa2d12-6277-47c6-a3fc-b5fea1485600n@googlegroups.com> (raw)
In-Reply-To: <51ca8210-3d60-4d5d-9af2-04c85995deb6n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>


[-- Attachment #1.1: Type: text/plain, Size: 5013 bytes --]

 

Lua filters only change Pandoc's AST representation of your document, i.e. 
before it is then converted to LaTeX. A Raw block filter will not act on 
Pandoc's LaTeX output, but only on Raw LaTeX blocks that are in the 
markdown itself.

A Pandoc solution would be to write a custom Lua *writer* 
<https://pandoc.org/custom-writers.html>. The writer would use pandoc.write 
to generate Pandoc's own LaTeX output (body only) and modify it with 
regular expressions or Lua patterns. To replace just a command name this is 
fairly easy, though longer than the third solution below.

A LaTeX solution is to redefine \caption as \sidecaption:
\renewcommand{\caption}{\sidecaption} 

You can keep this enclosed in groups ({...}) to ensure that the 
redefinition only applies locally.

A hybrid Pandoc/LaTeX solution is a Lua filter that insert LaTeX code to 
redefine \caption around figures:

``` lua
if FORMAT:match 'latex' then
    function Figure (elem) return { 
        pandoc.RawBlock('latex','{\\renewcommand{\\caption}{\\subcaption}'
), 
         elem, 
         pandoc.RawBlock('latex','}') 
       } 
   end 
end

```

This replaces any 'Figure' block element by a list (succession) of three 
raw LaTeX blocks. The output should look like:
{\renewcommand{\caption}{\subcaption} 
... Pandoc's LaTeX for the figure ... 
} 

Reposted from 
https://stackoverflow.com/questions/77504584/pandoc-md-latex-write-lua-filter-to-change-latex-macro-used-for-caption/77607636#77607636

On Monday, November 20, 2023 at 7:06:57 AM UTC+11 lukeflo wrote:

> Hi everybody,
>
> I have written a custom latex `.cls' file to establish a typesetting
> workflow for the scientific journals of my research institute. The texts
> should be written in Markdown and then be processed with `pandoc' to
> LaTeX.
>
> I already have an elaborated pandoc template to produce the LaTeX
> preambel etc. So far its working great.
>
> But for the figures I need the caption from the Markdown file to be set
> with `\sidecaption' instead of `\caption' in LaTeX, as well as with an
> optional argument (short-caption) for the image attribution in the list
> of figures.
>
> To get the latter working I use the following template from a GitHub
> discussion in the [pandoc repo]:
>
> ┌────
> │ PANDOC_VERSION:must_be_at_least '3.1'
> │
> │ if FORMAT:match 'latex' then
> │   function Figure(f)
> │     local short = f.content[1].content[1].attributes['short-caption']
> │     if short and not f.caption.short then
> │       f.caption.short = pandoc.Inlines(short)
> │     end
> │     return f
> │   end
> │ end
> └────
>
> That works without any flaws.
>
> But now I need to figure out how to change the LaTeX macro used for the
> caption. The older [approach of pre pandoc version 3.0 posted] by tarleb
> is really intuitive and I could have easily adapted it to my needs. But
> since pandoc 3.0 there is the new [/complex figures/] approach and, so
> far, I couldn't figure out how to change the LaTeX macro used for the
> captions with this new behaviour.
>
> I tried something like that (Adapted from [here]:
>
> ┌────
> │ if FORMAT:match 'latex' then
> │   function RawBlock (raw)
> │     local caption = raw.text:match('\\caption')
> │     if caption then
> │        raw:gsub('\\caption', '\\sidecaption')
> │     end
> │     return raw
> │   end
> │ end
> └────
>
> But nothing happened.
>
> The main challenge for me are my more-or-less non-existing lua skills. I
> just never had to use it for my daily tasks. I thought about using `awk'
> or `sed' to edit the `.tex' file itself using a regex-substitution, but
> that should remain an absolute stopgap, since it makes the whole
> workflow less portable.
>
> Thus, I'm hoping for a hint/a solution in form of a pandoc-lua script
> which 1. helps me to achieve the goal, and 2. improve my understanding
> of lua and the /complex figures/ approach for similar future tasks.
>
> I appreciate any tipp!
>
> Best,
> Lukeflo
>
> This question is also posted on StackOverFlow: 
> https://stackoverflow.com/q/77504584/19647155
>
> [pandoc repo]
> <https://github.com/jgm/pandoc/issues/7915#issuecomment-1427113349>
>
> [approach of pre pandoc version 3.0 posted]
> <https://github.com/jgm/pandoc/issues/7915#issuecomment-1039370851>
>
> [/complex figures/] <https://github.com/jgm/pandoc/releases?page=2>
>
> [here] <https://stackoverflow.com/a/71296595/19647155>
>

-- 
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/f3fa2d12-6277-47c6-a3fc-b5fea1485600n%40googlegroups.com.

[-- Attachment #1.2: Type: text/html, Size: 8035 bytes --]

  parent reply	other threads:[~2023-12-05 16:09 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-19 20:06 'lukeflo' via pandoc-discuss
     [not found] ` <51ca8210-3d60-4d5d-9af2-04c85995deb6n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-12-05 16:09   ` Julien Dutant [this message]
     [not found]     ` <f3fa2d12-6277-47c6-a3fc-b5fea1485600n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-12-08  7:35       ` 'lukeflo' via pandoc-discuss
     [not found]         ` <b565fdd5-8216-4596-a2ed-c75019aad172n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-12-11 10:33           ` 'lukeflo' via pandoc-discuss
     [not found]             ` <b419ae83-de83-4035-97cd-fb41cb6be647n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-12-11 10:36               ` 'lukeflo' via pandoc-discuss
     [not found]                 ` <32dfe8eb-98ac-40ee-92d7-162528add367n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-12-11 11:30                   ` 'William Lupton' via pandoc-discuss
     [not found]                     ` <CAEe_xxikobOS_G9x71nxtz0dr99VVhgBV8in=xKzXgh7JMaRcw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2023-12-11 14:53                       ` Pablo Serrati
     [not found]                         ` <CACTSqG5L4o7npfcUV1iGPMi5fbUrqgPc+5ttPQmZhNTFW7Vsng-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2023-12-11 22:04                           ` 'lukeflo' via pandoc-discuss
     [not found]                             ` <78503784-88bd-4d34-b5f5-a8634d667ba0n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-12-12 10:16                               ` 'William Lupton' via pandoc-discuss

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=f3fa2d12-6277-47c6-a3fc-b5fea1485600n@googlegroups.com \
    --to=julien.dutant-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).