Wandmalfarbe / pandoc-latex-template

A pandoc LaTeX template to convert markdown files to PDF or LaTeX.
BSD 3-Clause "New" or "Revised" License
6.09k stars 959 forks source link

Error producing PDF. ! Parameters must be numbered consecutively. #253

Open vizance opened 3 years ago

vizance commented 3 years ago

Hello @Wandmalfarbe

I'm trying using template to convert Markdown to PDF but encounter error ! Parameters must be numbered consecutively.

Below are the details.


I. Issue Backgrounds

1. Command & Error

Using template with this command pandoc "test1.md" -o "example_with_template.pdf" --pdf-engine=xelatex --from markdown --template eisvogel --listings

but encounter below error :

Error producing PDF.
! Parameters must be numbered consecutively.
<to be read again> 
                   ##
l.143    }

2. test1.md file content

---
title: title
author: author
date: "2020-01-13"
---

# H1

test

## H2

test

II. Version

  1. Pandoc : 2.14.1 (7/18/2021 release)
  2. MikTex : 21.7 (7/19/2021 release)
  3. Eisvogel : 2.0.0
  4. OS : Mac 11.5.1

Update

If I delete --pdf-engine=xelatex , eisvogel works successfully.

However, my document includes Chinese and must use --pdf-engine=xelatex and -V CJKmainfont to convert the file.

Hope someone can help...

yanyoliu commented 3 years ago

I have the same issue. Can somebody help me?

example.md

---
title: "Example PDF"
author: [Author]
date: "2017-02-20"
CJKmainfont: "PingFangTC-Regular"
titlepage: true
titlepage-rule-color: "360049"
titlepage-background: "background1.pdf"
---

# 您好 Hello

command pandoc example.md -o example.pdf --from markdown --template eisvogel --listings --pdf-engine=xelatex

cocowalla commented 2 years ago

Same issue here, and I think it's related to Polyglossia - if I remove Polyglossia from the template, everything works as expected.

vizance commented 2 years ago

@cocowalla Thanks for your feedback !

Could you explain more details on removing from which line (Polyglossia) ?

I could see possible related code is from line 433 to line 567 (see below), but not quite sure.

Thank you.

% Load polyglossia as late as possible: uses bidi with RTL langages (e.g. Hebrew, Arabic)
  \usepackage{polyglossia}
  \setmainlanguage[$for(polyglossia-lang.options)$$polyglossia-lang.options$$sep$,$endfor$]{$polyglossia-lang.name$}
$for(polyglossia-otherlangs)$
  \setotherlanguage[$for(polyglossia-otherlangs.options)$$polyglossia-otherlangs.options$$sep$,$endfor$]{$polyglossia-otherlangs.name$}
$endfor$
\else
  \usepackage[$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=$babel-lang$]{babel}
% get rid of language-specific shorthands (see #6817):
\let\LanguageShortHands\languageshorthands
\def\languageshorthands#1{}
$if(babel-newcommands)$
  $babel-newcommands$
$endif$
\fi
$endif$
\ifluatex
  \usepackage{selnolig}  % disable illegal ligatures
\fi
$if(dir)$
\ifxetex
  % Load bidi as late as possible as it modifies e.g. graphicx
  \usepackage{bidi}
\fi
\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
  \TeXXeTstate=1
  \newcommand{\RL}[1]{\beginR #1\endR}
  \newcommand{\LR}[1]{\beginL #1\endL}
  \newenvironment{RTL}{\beginR}{\endR}
  \newenvironment{LTR}{\beginL}{\endL}
\fi
$endif$
$if(natbib)$
\usepackage[$natbiboptions$]{natbib}
\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$}
$endif$
$if(biblatex)$
\usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex}
$for(bibliography)$
\addbibresource{$bibliography$}
$endfor$
$endif$
$if(csl-refs)$
\newlength{\cslhangindent}
\setlength{\cslhangindent}{1.5em}
\newlength{\csllabelwidth}
\setlength{\csllabelwidth}{3em}
\newenvironment{CSLReferences}[2] % #1 hanging-ident, #2 entry spacing
 {% don't indent paragraphs
  \setlength{\parindent}{0pt}
  % turn on hanging indent if param 1 is 1
  \ifodd #1 \everypar{\setlength{\hangindent}{\cslhangindent}}\ignorespaces\fi
  % set entry spacing
  \ifnum #2 > 0
  \setlength{\parskip}{#2\baselineskip}
  \fi
 }%
 {}
\usepackage{calc}
\newcommand{\CSLBlock}[1]{#1\hfill\break}
\newcommand{\CSLLeftMargin}[1]{\parbox[t]{\csllabelwidth}{#1}}
\newcommand{\CSLRightInline}[1]{\parbox[t]{\linewidth - \csllabelwidth}{#1}\break}
\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1}
$endif$
$if(csquotes)$
\usepackage{csquotes}
$endif$

$if(title)$
\title{$title$$if(thanks)$\thanks{$thanks$}$endif$}
$endif$
$if(subtitle)$
$if(beamer)$
$else$
\usepackage{etoolbox}
\makeatletter
\providecommand{\subtitle}[1]{% add subtitle to \maketitle
  \apptocmd{\@title}{\par {\large #1 \par}}{}{}
}
\makeatother
$endif$
\subtitle{$subtitle$}
$endif$
\author{$for(author)$$author$$sep$ \and $endfor$}
\date{$date$}
$if(beamer)$
$if(institute)$
\institute{$for(institute)$$institute$$sep$ \and $endfor$}
$endif$
$if(titlegraphic)$
\titlegraphic{\includegraphics{$titlegraphic$}}
$endif$
$if(logo)$
\logo{\includegraphics{$logo$}}
$endif$
$endif$

%%
%% added
%%

%
% language specification
%
% If no language is specified, use English as the default main document language.
%
$if(lang)$$else$
\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
  \usepackage[shorthands=off,$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=english]{babel}
$if(babel-newcommands)$
  $babel-newcommands$
$endif$
\else
  $if(mainfont)$
  $else$
  % Workaround for bug in Polyglossia that breaks `\familydefault` when `\setmainlanguage` is used.
  % See https://github.com/Wandmalfarbe/pandoc-latex-template/issues/8
  % See https://github.com/reutenauer/polyglossia/issues/186
  % See https://github.com/reutenauer/polyglossia/issues/127
  \renewcommand*\familydefault{\sfdefault}
  $endif$
  % load polyglossia as late as possible as it *could* call bidi if RTL lang (e.g. Hebrew or Arabic)
  \usepackage{polyglossia}
  \setmainlanguage[]{english}
$for(polyglossia-otherlangs)$
  \setotherlanguage[$polyglossia-otherlangs.options$]{$polyglossia-otherlangs.name$}
$endfor$
\fi
$endif$

$if(page-background)$
\usepackage[pages=all]{background}
$endif$
cocowalla commented 2 years ago

@vizance so basically I'm removing the use of Polyglossia, and always using Babel instead:

Before:

$if(lang)$
  \ifxetex
    % Load polyglossia as late as possible: uses bidi with RTL langages (e.g. Hebrew, Arabic)
    \usepackage{polyglossia}
    \setmainlanguage[$for(polyglossia-lang.options)$$polyglossia-lang.options$$sep$,$endfor$]{$polyglossia-lang.name$}
  $for(polyglossia-otherlangs)$
    \setotherlanguage[$for(polyglossia-otherlangs.options)$$polyglossia-otherlangs.options$$sep$,$endfor$]{$polyglossia-otherlangs.name$}
  $endfor$
  \else
    \usepackage[$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=$babel-lang$]{babel}
  % get rid of language-specific shorthands (see #6817):
  \let\LanguageShortHands\languageshorthands
  \def\languageshorthands#1{}
  $if(babel-newcommands)$
    $babel-newcommands$
  $endif$
  \fi
$endif$

After:

$if(lang)$
  \usepackage[$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=$babel-lang$]{babel}
  % get rid of language-specific shorthands (see #6817):
  \let\LanguageShortHands\languageshorthands
  \def\languageshorthands#1{}
  $if(babel-newcommands)$
    $babel-newcommands$
  $endif$
$endif$

I'm using an older version of this template that doesn't have the language specification section - that entire section should also be removed if you have it.

vizance commented 2 years ago

@cocowalla

Great, I will try to remove this section.

thank you so much !

yanyoliu commented 2 years ago

@cocowalla

Thanks, I got it.

But I need to modify another section to work

Before

$if(lang)$$else$
\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
  \usepackage[shorthands=off,$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=english]{babel}
$if(babel-newcommands)$
  $babel-newcommands$
$endif$
\else
  $if(mainfont)$
  $else$
  % Workaround for bug in Polyglossia that breaks `\familydefault` when `\setmainlanguage` is used.
  % See https://github.com/Wandmalfarbe/pandoc-latex-template/issues/8
  % See https://github.com/reutenauer/polyglossia/issues/186
  % See https://github.com/reutenauer/polyglossia/issues/127
  \renewcommand*\familydefault{\sfdefault}
  $endif$
  % load polyglossia as late as possible as it *could* call bidi if RTL lang (e.g. Hebrew or Arabic)
  \usepackage{polyglossia}
  \setmainlanguage[]{english}
$for(polyglossia-otherlangs)$
  \setotherlanguage[$polyglossia-otherlangs.options$]{$polyglossia-otherlangs.name$}
$endfor$
\fi
$endif$

After

$if(lang)$$else$
% \ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
  \usepackage[shorthands=off,$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=english]{babel}
$if(babel-newcommands)$
  $babel-newcommands$
$endif$
% \else
%   $if(mainfont)$
%   $else$
%   % Workaround for bug in Polyglossia that breaks `\familydefault` when `\setmainlanguage` is used.
%   % See https://github.com/Wandmalfarbe/pandoc-latex-template/issues/8
%   % See https://github.com/reutenauer/polyglossia/issues/186
%   % See https://github.com/reutenauer/polyglossia/issues/127
%   \renewcommand*\familydefault{\sfdefault}
%   $endif$
%   % load polyglossia as late as possible as it *could* call bidi if RTL lang (e.g. Hebrew or Arabic)
%   \usepackage{polyglossia}
%   \setmainlanguage[]{english}
% $for(polyglossia-otherlangs)$
%   \setotherlanguage[$polyglossia-otherlangs.options$]{$polyglossia-otherlangs.name$}
% $endfor$
% \fi
$endif$
Wandmalfarbe commented 2 years ago

Pandoc recently removed polyglossia support in favor of babel (https://github.com/jgm/pandoc/pull/7562). I merged the upstream changes here 496dfcf67f4cf827d18f3f7f19c10beda75fce81. Could you try again?

yanyoliu commented 2 years ago

Yes I tried it, now it works perfect! Thanks