Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove \hypertarget from pandoc LaTex output

I am using pypandoc to convert a markdown file to LaTex. My markdown file has a header, for example:

# Header Text # 

When pypandoc renders the file as a .tex file, this appears as:

\hypertarget{header-text}{%
\section{Header Text}\label{header-text}}

While this is a nice feature to make it easy to link back to section headers, I don't necessarily want that and would prefer in this case for pypandoc to just generate:

\section{Header Text}

Is there a pandoc setting, or a pypandoc setting, that can be used to turn off the \hypertarget{} feature? I have reviewed the documentation for pandoc and didn't see it anywhere.

like image 655
rsgny Avatar asked Sep 15 '18 02:09

rsgny


Video Answer


2 Answers

I had the same need, and I am using the -auto_identifiers switch,

pandoc -r markdown-auto_identifiers -w latex test.md -o test.tex

That will remove both

\hypertarget{header-text}{%

and

\label{header-text}}

leaving only

\section{Header Text}

like you requested.

Source

like image 191
gsl Avatar answered Oct 21 '22 07:10

gsl


There is no such switch. If you want different output, you'd either have to use a pandoc filter or, as @mb21 already noted, post-process the output.

Neither of these options is very good: using a filter to manually define header output will lose you all kinds of other pandoc features, like --top-level-division and support for unnumbered headers. Post-processing, on the other hand, tends to be brittle and difficult to get right.

Anyway, below is a panflute filter, which will replace headers with a custom command. Save it to a file and pass it to pypandoc via the filters option; this should give you the desired output.

from panflute import *

sectionTypes = ["section", "subsection", "subsubsection",
                "paragraph", "subparagraph"]

def reduce_header(elem, doc):
    if type(elem) == Header:
        cmd = "\\%s{" % sectionTypes[elem.level - 1]
        inlines = [RawInline(cmd, "tex")]
        inlines.extend(elem.content)
        inlines.append(RawInline("}", "tex"))
        return Plain(*inlines)

if __name__ == "__main__":
    run_filter(reduce_header)
like image 2
tarleb Avatar answered Oct 21 '22 08:10

tarleb