Skip to content

First-line-indent: fix bug with pre-existing header-includes #185

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 38 additions & 7 deletions first-line-indent/Makefile
Original file line number Diff line number Diff line change
@@ -2,18 +2,49 @@ DIFF ?= diff --strip-trailing-cr -u

.PHONY: test

test: test_latex test_html

test_html: sample.md expected.html first-line-indent.lua
@pandoc -s --lua-filter first-line-indent.lua --to=html $< \
test: sample.md expected.html \
sample_head-inc_1.md expected_hi_1.html expected_hi_1.tex \
sample_head-inc_2.md expected_hi_2.html expected_hi_2.tex \
sample_head-inc_3.md expected_hi_3.html expected_hi_3.tex \
first-line-indent.lua
@pandoc -s --lua-filter first-line-indent.lua --to=html sample.md \
| $(DIFF) expected.html -

test_latex: sample.md expected.tex first-line-indent.lua
@pandoc -s --lua-filter first-line-indent.lua --to=latex $< \
@pandoc -s --lua-filter first-line-indent.lua --to=latex sample.md \
| $(DIFF) expected.tex -
@pandoc -s --lua-filter first-line-indent.lua --to=html sample_head-inc_1.md \
| $(DIFF) expected_hi_1.html -
@pandoc -s --lua-filter first-line-indent.lua --to=latex sample_head-inc_1.md \
| $(DIFF) expected_hi_1.tex -
@pandoc -s --lua-filter first-line-indent.lua --to=html sample_head-inc_2.md \
| $(DIFF) expected_hi_2.html -
@pandoc -s --lua-filter first-line-indent.lua --to=latex sample_head-inc_2.md \
| $(DIFF) expected_hi_2.tex -
@pandoc -s --lua-filter first-line-indent.lua --to=html sample_head-inc_3.md \
| $(DIFF) expected_hi_3.html -
@pandoc -s --lua-filter first-line-indent.lua --to=latex sample_head-inc_3.md \
| $(DIFF) expected_hi_3.tex -

expected.html: sample.md first-line-indent.lua
pandoc -s --lua-filter first-line-indent.lua --output $@ $<

expected.tex: sample.md first-line-indent.lua
pandoc -s --lua-filter first-line-indent.lua --output $@ $<

expected_hi_1.html: sample_head-inc_1.md first-line-indent.lua
pandoc -s --lua-filter first-line-indent.lua --output $@ $<

expected_hi_1.tex: sample_head-inc_1.md first-line-indent.lua
pandoc -s --lua-filter first-line-indent.lua --output $@ $<

expected_hi_2.html: sample_head-inc_2.md first-line-indent.lua
pandoc -s --lua-filter first-line-indent.lua --output $@ $<

expected_hi_2.tex: sample_head-inc_2.md first-line-indent.lua
pandoc -s --lua-filter first-line-indent.lua --output $@ $<

expected_hi_3.html: sample_head-inc_3.md first-line-indent.lua
pandoc -s --lua-filter first-line-indent.lua --output $@ $<

expected_hi_3.tex: sample_head-inc_3.md first-line-indent.lua
pandoc -s --lua-filter first-line-indent.lua --output $@ $<

319 changes: 319 additions & 0 deletions first-line-indent/expected_hi_1.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,319 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title>Sample first line indent</title>
<style>
html {
line-height: 1.5;
font-family: Georgia, serif;
font-size: 20px;
color: #1a1a1a;
background-color: #fdfdfd;
}
body {
margin: 0 auto;
max-width: 36em;
padding-left: 50px;
padding-right: 50px;
padding-top: 50px;
padding-bottom: 50px;
hyphens: auto;
word-wrap: break-word;
text-rendering: optimizeLegibility;
font-kerning: normal;
}
@media (max-width: 600px) {
body {
font-size: 0.9em;
padding: 1em;
}
}
@media print {
body {
background-color: transparent;
color: black;
font-size: 12pt;
}
p, h2, h3 {
orphans: 3;
widows: 3;
}
h2, h3, h4 {
page-break-after: avoid;
}
}
p {
margin: 1em 0;
}
a {
color: #1a1a1a;
}
a:visited {
color: #1a1a1a;
}
img {
max-width: 100%;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 1.4em;
}
h5, h6 {
font-size: 1em;
font-style: italic;
}
h6 {
font-weight: normal;
}
ol, ul {
padding-left: 1.7em;
margin-top: 1em;
}
li > ol, li > ul {
margin-top: 0;
}
blockquote {
margin: 1em 0 1em 1.7em;
padding-left: 1em;
border-left: 2px solid #e6e6e6;
color: #606060;
}
code {
font-family: Menlo, Monaco, 'Lucida Console', Consolas, monospace;
font-size: 85%;
margin: 0;
}
pre {
margin: 1em 0;
overflow: auto;
}
pre code {
padding: 0;
overflow: visible;
}
.sourceCode {
background-color: transparent;
overflow: visible;
}
hr {
background-color: #1a1a1a;
border: none;
height: 1px;
margin: 1em 0;
}
table {
margin: 1em 0;
border-collapse: collapse;
width: 100%;
overflow-x: auto;
display: block;
font-variant-numeric: lining-nums tabular-nums;
}
table caption {
margin-bottom: 0.75em;
}
tbody {
margin-top: 0.5em;
border-top: 1px solid #1a1a1a;
border-bottom: 1px solid #1a1a1a;
}
th {
border-top: 1px solid #1a1a1a;
padding: 0.25em 0.5em 0.25em 0.5em;
}
td {
padding: 0.125em 0.5em 0.25em 0.5em;
}
header {
margin-bottom: 4em;
text-align: center;
}
#TOC li {
list-style: none;
}
#TOC a:not(:hover) {
text-decoration: none;
}
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
</style>
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
<![endif]-->
<style>
p {
text-indent: 2em;
margin: 0;
}
header + p {
text-indent: ;
}
:is(h1, h2, h3, h4, h5, h6) + p {
text-indent: 0;
}
:is(div.no-first-line-indent-after) + p {
text-indent: 0;
}
:is(div.first-line-indent-after) + p {
text-indent: 2em;
}
</style>
Raw header text
</head>
<body>
<header id="title-block-header">
<h1 class="title">Sample first line indent</h1>
</header>
<p>This sample tests the filter on a document with a metadata header-includes of the MetaInlines type.</p>
<p>First paragraph. In English-style typography, the first paragraph shouldn’t have a first-line indent, nor the paragraphs below headers.</p>
<p>This paragraph should start with a first-line indent. But after this quote:</p>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</blockquote>
<div class="no-first-line-indent-after"></div>
<p>the paragraph continues, so there should not be a first-line indent.</p>
<p>The quote below ends a paragraph:</p>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</blockquote>
<div class="first-line-indent-after"></div>
<p>This paragraph, then, is genuinely a new paragraph and starts with a first-line indent.</p>
<h1 id="further-tests">Further tests</h1>
<p>After a heading (in English typographic style) the paragraph does not have a first-line indent.</p>
<p>In the couple couple of paragraphs that follow the quotes below, we have manually specified <code>\noindent</code> and <code>\indent</code> respectively. This is to check that the filter doesn’t add its own commands to those.</p>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</blockquote>
<div class="no-first-line-indent-after"></div>
<p>Manually specified no first line indent.</p>
<div class="first-line-indent-after"></div>
<p>Manually specified first line ident.</p>
<p>We can also check that indent is removed after lists:</p>
<ul>
<li>A bullet</li>
<li>list</li>
</ul>
<div class="no-first-line-indent-after"></div>
<p>And after code blocks:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode lua"><code class="sourceCode lua"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">local</span> variable <span class="op">=</span> <span class="st">&quot;value&quot;</span></span></code></pre></div>
<div class="no-first-line-indent-after"></div>
<p>Or horizontal rules.</p>
<hr />
<div class="no-first-line-indent-after"></div>
<p>In this document we added a few custom filter options. The size of first-line indents is 2em instead of the standard 1em. We also added an option to remove indent after tables:</p>
<table>
<caption>Demonstration of simple table syntax.</caption>
<thead>
<tr class="header">
<th style="text-align: right;">Right</th>
<th style="text-align: left;">Left</th>
<th style="text-align: center;">Center</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: right;">12</td>
<td style="text-align: left;">12</td>
<td style="text-align: center;">12</td>
<td>12</td>
</tr>
<tr class="even">
<td style="text-align: right;">123</td>
<td style="text-align: left;">123</td>
<td style="text-align: center;">123</td>
<td>123</td>
</tr>
<tr class="odd">
<td style="text-align: right;">1</td>
<td style="text-align: left;">1</td>
<td style="text-align: center;">1</td>
<td>1</td>
</tr>
</tbody>
</table>
<div class="no-first-line-indent-after"></div>
<p>So this paragraph’s first line is not indented. And we included custom options <em>not</em> to remove ident after ordered lists and definition lists:</p>
<dl>
<dt>Definition</dt>
<dd>This is a definition block.
</dd>
</dl>
<p>This paragraph is indented.</p>
<ol type="1">
<li>An ordered</li>
<li>list</li>
</ol>
<p>This paragraph is indented.</p>
</body>
</html>
207 changes: 207 additions & 0 deletions first-line-indent/expected_hi_1.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
% Options for packages loaded elsewhere
\PassOptionsToPackage{unicode}{hyperref}
\PassOptionsToPackage{hyphens}{url}
%
\documentclass[
]{article}
\title{Sample first line indent}
\author{}
\date{}

\usepackage{amsmath,amssymb}
\usepackage{lmodern}
\usepackage{iftex}
\ifPDFTeX
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{textcomp} % provide euro and other symbols
\else % if luatex or xetex
\usepackage{unicode-math}
\defaultfontfeatures{Scale=MatchLowercase}
\defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1}
\fi
% Use upquote if available, for straight quotes in verbatim environments
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\IfFileExists{microtype.sty}{% use microtype if available
\usepackage[]{microtype}
\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
}{}
\usepackage{xcolor}
\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available
\IfFileExists{bookmark.sty}{\usepackage{bookmark}}{\usepackage{hyperref}}
\hypersetup{
pdftitle={Sample first line indent},
hidelinks,
pdfcreator={LaTeX via pandoc}}
\urlstyle{same} % disable monospaced font for URLs
\usepackage{color}
\usepackage{fancyvrb}
\newcommand{\VerbBar}{|}
\newcommand{\VERB}{\Verb[commandchars=\\\{\}]}
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}}
% Add ',fontsize=\small' for more characters per line
\newenvironment{Shaded}{}{}
\newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{#1}}}
\newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
\newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{#1}}
\newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
\newcommand{\BuiltInTok}[1]{#1}
\newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{#1}}}
\newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
\newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{#1}}
\newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{#1}}}
\newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{#1}}
\newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
\newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{#1}}}
\newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{#1}}}
\newcommand{\ExtensionTok}[1]{#1}
\newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
\newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{#1}}
\newcommand{\ImportTok}[1]{#1}
\newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
\newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{#1}}}
\newcommand{\NormalTok}[1]{#1}
\newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}}
\newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{#1}}
\newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{#1}}
\newcommand{\RegionMarkerTok}[1]{#1}
\newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{#1}}
\newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{#1}}
\newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
\usepackage{longtable,booktabs,array}
\usepackage{calc} % for calculating minipage widths
% Correct order of tables after \paragraph or \subparagraph
\usepackage{etoolbox}
\makeatletter
\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{}
\makeatother
% Allow footnotes in longtable head/foot
\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}}
\makesavenoteenv{longtable}
\setlength{\emergencystretch}{3em} % prevent overfull lines
\providecommand{\tightlist}{%
\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
\setcounter{secnumdepth}{-\maxdimen} % remove section numbering
\setlength{\parindent}{2em}
Raw header text
\ifLuaTeX
\usepackage{selnolig} % disable illegal ligatures
\fi

\begin{document}
\maketitle

This sample tests the filter on a document with a metadata
header-includes of the MetaInlines type.

First paragraph. In English-style typography, the first paragraph
shouldn't have a first-line indent, nor the paragraphs below headers.

This paragraph should start with a first-line indent. But after this
quote:

\begin{quote}
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\end{quote}

\noindent the paragraph continues, so there should not be a first-line
indent.

The quote below ends a paragraph:

\begin{quote}
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\end{quote}

\indent This paragraph, then, is genuinely a new paragraph and starts
with a first-line indent.

\hypertarget{further-tests}{%
\section{Further tests}\label{further-tests}}

After a heading (in English typographic style) the paragraph does not
have a first-line indent.

In the couple couple of paragraphs that follow the quotes below, we have
manually specified \texttt{\textbackslash{}noindent} and
\texttt{\textbackslash{}indent} respectively. This is to check that the
filter doesn't add its own commands to those.

\begin{quote}
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\end{quote}

\noindent Manually specified no first line indent.

\indent Manually specified first line ident.

We can also check that indent is removed after lists:

\begin{itemize}
\tightlist
\item
A bullet
\item
list
\end{itemize}

\noindent And after code blocks:

\begin{Shaded}
\begin{Highlighting}[]
\KeywordTok{local}\NormalTok{ variable }\OperatorTok{=} \StringTok{"value"}
\end{Highlighting}
\end{Shaded}

\noindent Or horizontal rules.

\begin{center}\rule{0.5\linewidth}{0.5pt}\end{center}

\noindent In this document we added a few custom filter options. The
size of first-line indents is 2em instead of the standard 1em. We also
added an option to remove indent after tables:

\begin{longtable}[]{@{}rlcl@{}}
\caption{Demonstration of simple table syntax.}\tabularnewline
\toprule
Right & Left & Center & Default \\
\midrule
\endfirsthead
\toprule
Right & Left & Center & Default \\
\midrule
\endhead
12 & 12 & 12 & 12 \\
123 & 123 & 123 & 123 \\
1 & 1 & 1 & 1 \\
\bottomrule
\end{longtable}

\noindent So this paragraph's first line is not indented. And we
included custom options \emph{not} to remove ident after ordered lists
and definition lists:

\begin{description}
\tightlist
\item[Definition]
This is a definition block.
\end{description}

This paragraph is indented.

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\tightlist
\item
An ordered
\item
list
\end{enumerate}

This paragraph is indented.

\end{document}
319 changes: 319 additions & 0 deletions first-line-indent/expected_hi_2.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,319 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title>Sample first line indent</title>
<style>
html {
line-height: 1.5;
font-family: Georgia, serif;
font-size: 20px;
color: #1a1a1a;
background-color: #fdfdfd;
}
body {
margin: 0 auto;
max-width: 36em;
padding-left: 50px;
padding-right: 50px;
padding-top: 50px;
padding-bottom: 50px;
hyphens: auto;
word-wrap: break-word;
text-rendering: optimizeLegibility;
font-kerning: normal;
}
@media (max-width: 600px) {
body {
font-size: 0.9em;
padding: 1em;
}
}
@media print {
body {
background-color: transparent;
color: black;
font-size: 12pt;
}
p, h2, h3 {
orphans: 3;
widows: 3;
}
h2, h3, h4 {
page-break-after: avoid;
}
}
p {
margin: 1em 0;
}
a {
color: #1a1a1a;
}
a:visited {
color: #1a1a1a;
}
img {
max-width: 100%;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 1.4em;
}
h5, h6 {
font-size: 1em;
font-style: italic;
}
h6 {
font-weight: normal;
}
ol, ul {
padding-left: 1.7em;
margin-top: 1em;
}
li > ol, li > ul {
margin-top: 0;
}
blockquote {
margin: 1em 0 1em 1.7em;
padding-left: 1em;
border-left: 2px solid #e6e6e6;
color: #606060;
}
code {
font-family: Menlo, Monaco, 'Lucida Console', Consolas, monospace;
font-size: 85%;
margin: 0;
}
pre {
margin: 1em 0;
overflow: auto;
}
pre code {
padding: 0;
overflow: visible;
}
.sourceCode {
background-color: transparent;
overflow: visible;
}
hr {
background-color: #1a1a1a;
border: none;
height: 1px;
margin: 1em 0;
}
table {
margin: 1em 0;
border-collapse: collapse;
width: 100%;
overflow-x: auto;
display: block;
font-variant-numeric: lining-nums tabular-nums;
}
table caption {
margin-bottom: 0.75em;
}
tbody {
margin-top: 0.5em;
border-top: 1px solid #1a1a1a;
border-bottom: 1px solid #1a1a1a;
}
th {
border-top: 1px solid #1a1a1a;
padding: 0.25em 0.5em 0.25em 0.5em;
}
td {
padding: 0.125em 0.5em 0.25em 0.5em;
}
header {
margin-bottom: 4em;
text-align: center;
}
#TOC li {
list-style: none;
}
#TOC a:not(:hover) {
text-decoration: none;
}
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
</style>
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
<![endif]-->
<style>
p {
text-indent: 2em;
margin: 0;
}
header + p {
text-indent: ;
}
:is(h1, h2, h3, h4, h5, h6) + p {
text-indent: 0;
}
:is(div.no-first-line-indent-after) + p {
text-indent: 0;
}
:is(div.first-line-indent-after) + p {
text-indent: 2em;
}
</style>
<style>p {color:blue;}</style>
</head>
<body>
<header id="title-block-header">
<h1 class="title">Sample first line indent</h1>
</header>
<p>This sample tests the filter on a document with a metadata header-includes of the MetaBlocks type.</p>
<p>First paragraph. In English-style typography, the first paragraph shouldn’t have a first-line indent, nor the paragraphs below headers.</p>
<p>This paragraph should start with a first-line indent. But after this quote:</p>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</blockquote>
<div class="no-first-line-indent-after"></div>
<p>the paragraph continues, so there should not be a first-line indent.</p>
<p>The quote below ends a paragraph:</p>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</blockquote>
<div class="first-line-indent-after"></div>
<p>This paragraph, then, is genuinely a new paragraph and starts with a first-line indent.</p>
<h1 id="further-tests">Further tests</h1>
<p>After a heading (in English typographic style) the paragraph does not have a first-line indent.</p>
<p>In the couple couple of paragraphs that follow the quotes below, we have manually specified <code>\noindent</code> and <code>\indent</code> respectively. This is to check that the filter doesn’t add its own commands to those.</p>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</blockquote>
<div class="no-first-line-indent-after"></div>
<p>Manually specified no first line indent.</p>
<div class="first-line-indent-after"></div>
<p>Manually specified first line ident.</p>
<p>We can also check that indent is removed after lists:</p>
<ul>
<li>A bullet</li>
<li>list</li>
</ul>
<div class="no-first-line-indent-after"></div>
<p>And after code blocks:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode lua"><code class="sourceCode lua"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">local</span> variable <span class="op">=</span> <span class="st">&quot;value&quot;</span></span></code></pre></div>
<div class="no-first-line-indent-after"></div>
<p>Or horizontal rules.</p>
<hr />
<div class="no-first-line-indent-after"></div>
<p>In this document we added a few custom filter options. The size of first-line indents is 2em instead of the standard 1em. We also added an option to remove indent after tables:</p>
<table>
<caption>Demonstration of simple table syntax.</caption>
<thead>
<tr class="header">
<th style="text-align: right;">Right</th>
<th style="text-align: left;">Left</th>
<th style="text-align: center;">Center</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: right;">12</td>
<td style="text-align: left;">12</td>
<td style="text-align: center;">12</td>
<td>12</td>
</tr>
<tr class="even">
<td style="text-align: right;">123</td>
<td style="text-align: left;">123</td>
<td style="text-align: center;">123</td>
<td>123</td>
</tr>
<tr class="odd">
<td style="text-align: right;">1</td>
<td style="text-align: left;">1</td>
<td style="text-align: center;">1</td>
<td>1</td>
</tr>
</tbody>
</table>
<div class="no-first-line-indent-after"></div>
<p>So this paragraph’s first line is not indented. And we included custom options <em>not</em> to remove ident after ordered lists and definition lists:</p>
<dl>
<dt>Definition</dt>
<dd>This is a definition block.
</dd>
</dl>
<p>This paragraph is indented.</p>
<ol type="1">
<li>An ordered</li>
<li>list</li>
</ol>
<p>This paragraph is indented.</p>
</body>
</html>
207 changes: 207 additions & 0 deletions first-line-indent/expected_hi_2.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
% Options for packages loaded elsewhere
\PassOptionsToPackage{unicode}{hyperref}
\PassOptionsToPackage{hyphens}{url}
%
\documentclass[
]{article}
\title{Sample first line indent}
\author{}
\date{}

\usepackage{amsmath,amssymb}
\usepackage{lmodern}
\usepackage{iftex}
\ifPDFTeX
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{textcomp} % provide euro and other symbols
\else % if luatex or xetex
\usepackage{unicode-math}
\defaultfontfeatures{Scale=MatchLowercase}
\defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1}
\fi
% Use upquote if available, for straight quotes in verbatim environments
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\IfFileExists{microtype.sty}{% use microtype if available
\usepackage[]{microtype}
\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
}{}
\usepackage{xcolor}
\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available
\IfFileExists{bookmark.sty}{\usepackage{bookmark}}{\usepackage{hyperref}}
\hypersetup{
pdftitle={Sample first line indent},
hidelinks,
pdfcreator={LaTeX via pandoc}}
\urlstyle{same} % disable monospaced font for URLs
\usepackage{color}
\usepackage{fancyvrb}
\newcommand{\VerbBar}{|}
\newcommand{\VERB}{\Verb[commandchars=\\\{\}]}
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}}
% Add ',fontsize=\small' for more characters per line
\newenvironment{Shaded}{}{}
\newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{#1}}}
\newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
\newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{#1}}
\newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
\newcommand{\BuiltInTok}[1]{#1}
\newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{#1}}}
\newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
\newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{#1}}
\newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{#1}}}
\newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{#1}}
\newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
\newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{#1}}}
\newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{#1}}}
\newcommand{\ExtensionTok}[1]{#1}
\newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
\newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{#1}}
\newcommand{\ImportTok}[1]{#1}
\newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
\newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{#1}}}
\newcommand{\NormalTok}[1]{#1}
\newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}}
\newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{#1}}
\newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{#1}}
\newcommand{\RegionMarkerTok}[1]{#1}
\newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{#1}}
\newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{#1}}
\newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
\usepackage{longtable,booktabs,array}
\usepackage{calc} % for calculating minipage widths
% Correct order of tables after \paragraph or \subparagraph
\usepackage{etoolbox}
\makeatletter
\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{}
\makeatother
% Allow footnotes in longtable head/foot
\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}}
\makesavenoteenv{longtable}
\setlength{\emergencystretch}{3em} % prevent overfull lines
\providecommand{\tightlist}{%
\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
\setcounter{secnumdepth}{-\maxdimen} % remove section numbering
\setlength{\parindent}{2em}
\usepackage{lipsum}
\ifLuaTeX
\usepackage{selnolig} % disable illegal ligatures
\fi

\begin{document}
\maketitle

This sample tests the filter on a document with a metadata
header-includes of the MetaBlocks type.

First paragraph. In English-style typography, the first paragraph
shouldn't have a first-line indent, nor the paragraphs below headers.

This paragraph should start with a first-line indent. But after this
quote:

\begin{quote}
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\end{quote}

\noindent the paragraph continues, so there should not be a first-line
indent.

The quote below ends a paragraph:

\begin{quote}
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\end{quote}

\indent This paragraph, then, is genuinely a new paragraph and starts
with a first-line indent.

\hypertarget{further-tests}{%
\section{Further tests}\label{further-tests}}

After a heading (in English typographic style) the paragraph does not
have a first-line indent.

In the couple couple of paragraphs that follow the quotes below, we have
manually specified \texttt{\textbackslash{}noindent} and
\texttt{\textbackslash{}indent} respectively. This is to check that the
filter doesn't add its own commands to those.

\begin{quote}
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\end{quote}

\noindent Manually specified no first line indent.

\indent Manually specified first line ident.

We can also check that indent is removed after lists:

\begin{itemize}
\tightlist
\item
A bullet
\item
list
\end{itemize}

\noindent And after code blocks:

\begin{Shaded}
\begin{Highlighting}[]
\KeywordTok{local}\NormalTok{ variable }\OperatorTok{=} \StringTok{"value"}
\end{Highlighting}
\end{Shaded}

\noindent Or horizontal rules.

\begin{center}\rule{0.5\linewidth}{0.5pt}\end{center}

\noindent In this document we added a few custom filter options. The
size of first-line indents is 2em instead of the standard 1em. We also
added an option to remove indent after tables:

\begin{longtable}[]{@{}rlcl@{}}
\caption{Demonstration of simple table syntax.}\tabularnewline
\toprule
Right & Left & Center & Default \\
\midrule
\endfirsthead
\toprule
Right & Left & Center & Default \\
\midrule
\endhead
12 & 12 & 12 & 12 \\
123 & 123 & 123 & 123 \\
1 & 1 & 1 & 1 \\
\bottomrule
\end{longtable}

\noindent So this paragraph's first line is not indented. And we
included custom options \emph{not} to remove ident after ordered lists
and definition lists:

\begin{description}
\tightlist
\item[Definition]
This is a definition block.
\end{description}

This paragraph is indented.

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\tightlist
\item
An ordered
\item
list
\end{enumerate}

This paragraph is indented.

\end{document}
320 changes: 320 additions & 0 deletions first-line-indent/expected_hi_3.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,320 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title>Sample first line indent</title>
<style>
html {
line-height: 1.5;
font-family: Georgia, serif;
font-size: 20px;
color: #1a1a1a;
background-color: #fdfdfd;
}
body {
margin: 0 auto;
max-width: 36em;
padding-left: 50px;
padding-right: 50px;
padding-top: 50px;
padding-bottom: 50px;
hyphens: auto;
word-wrap: break-word;
text-rendering: optimizeLegibility;
font-kerning: normal;
}
@media (max-width: 600px) {
body {
font-size: 0.9em;
padding: 1em;
}
}
@media print {
body {
background-color: transparent;
color: black;
font-size: 12pt;
}
p, h2, h3 {
orphans: 3;
widows: 3;
}
h2, h3, h4 {
page-break-after: avoid;
}
}
p {
margin: 1em 0;
}
a {
color: #1a1a1a;
}
a:visited {
color: #1a1a1a;
}
img {
max-width: 100%;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 1.4em;
}
h5, h6 {
font-size: 1em;
font-style: italic;
}
h6 {
font-weight: normal;
}
ol, ul {
padding-left: 1.7em;
margin-top: 1em;
}
li > ol, li > ul {
margin-top: 0;
}
blockquote {
margin: 1em 0 1em 1.7em;
padding-left: 1em;
border-left: 2px solid #e6e6e6;
color: #606060;
}
code {
font-family: Menlo, Monaco, 'Lucida Console', Consolas, monospace;
font-size: 85%;
margin: 0;
}
pre {
margin: 1em 0;
overflow: auto;
}
pre code {
padding: 0;
overflow: visible;
}
.sourceCode {
background-color: transparent;
overflow: visible;
}
hr {
background-color: #1a1a1a;
border: none;
height: 1px;
margin: 1em 0;
}
table {
margin: 1em 0;
border-collapse: collapse;
width: 100%;
overflow-x: auto;
display: block;
font-variant-numeric: lining-nums tabular-nums;
}
table caption {
margin-bottom: 0.75em;
}
tbody {
margin-top: 0.5em;
border-top: 1px solid #1a1a1a;
border-bottom: 1px solid #1a1a1a;
}
th {
border-top: 1px solid #1a1a1a;
padding: 0.25em 0.5em 0.25em 0.5em;
}
td {
padding: 0.125em 0.5em 0.25em 0.5em;
}
header {
margin-bottom: 4em;
text-align: center;
}
#TOC li {
list-style: none;
}
#TOC a:not(:hover) {
text-decoration: none;
}
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
</style>
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
<![endif]-->
<style>
p {
text-indent: 2em;
margin: 0;
}
header + p {
text-indent: ;
}
:is(h1, h2, h3, h4, h5, h6) + p {
text-indent: 0;
}
:is(div.no-first-line-indent-after) + p {
text-indent: 0;
}
:is(div.first-line-indent-after) + p {
text-indent: 2em;
}
</style>

<style>p {color:blue;}</style>
</head>
<body>
<header id="title-block-header">
<h1 class="title">Sample first line indent</h1>
</header>
<p>This sample tests the filter on a document with a metadata header-includes of the MetaList type.</p>
<p>First paragraph. In English-style typography, the first paragraph shouldn’t have a first-line indent, nor the paragraphs below headers.</p>
<p>This paragraph should start with a first-line indent. But after this quote:</p>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</blockquote>
<div class="no-first-line-indent-after"></div>
<p>the paragraph continues, so there should not be a first-line indent.</p>
<p>The quote below ends a paragraph:</p>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</blockquote>
<div class="first-line-indent-after"></div>
<p>This paragraph, then, is genuinely a new paragraph and starts with a first-line indent.</p>
<h1 id="further-tests">Further tests</h1>
<p>After a heading (in English typographic style) the paragraph does not have a first-line indent.</p>
<p>In the couple couple of paragraphs that follow the quotes below, we have manually specified <code>\noindent</code> and <code>\indent</code> respectively. This is to check that the filter doesn’t add its own commands to those.</p>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</blockquote>
<div class="no-first-line-indent-after"></div>
<p>Manually specified no first line indent.</p>
<div class="first-line-indent-after"></div>
<p>Manually specified first line ident.</p>
<p>We can also check that indent is removed after lists:</p>
<ul>
<li>A bullet</li>
<li>list</li>
</ul>
<div class="no-first-line-indent-after"></div>
<p>And after code blocks:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode lua"><code class="sourceCode lua"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">local</span> variable <span class="op">=</span> <span class="st">&quot;value&quot;</span></span></code></pre></div>
<div class="no-first-line-indent-after"></div>
<p>Or horizontal rules.</p>
<hr />
<div class="no-first-line-indent-after"></div>
<p>In this document we added a few custom filter options. The size of first-line indents is 2em instead of the standard 1em. We also added an option to remove indent after tables:</p>
<table>
<caption>Demonstration of simple table syntax.</caption>
<thead>
<tr class="header">
<th style="text-align: right;">Right</th>
<th style="text-align: left;">Left</th>
<th style="text-align: center;">Center</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: right;">12</td>
<td style="text-align: left;">12</td>
<td style="text-align: center;">12</td>
<td>12</td>
</tr>
<tr class="even">
<td style="text-align: right;">123</td>
<td style="text-align: left;">123</td>
<td style="text-align: center;">123</td>
<td>123</td>
</tr>
<tr class="odd">
<td style="text-align: right;">1</td>
<td style="text-align: left;">1</td>
<td style="text-align: center;">1</td>
<td>1</td>
</tr>
</tbody>
</table>
<div class="no-first-line-indent-after"></div>
<p>So this paragraph’s first line is not indented. And we included custom options <em>not</em> to remove ident after ordered lists and definition lists:</p>
<dl>
<dt>Definition</dt>
<dd>This is a definition block.
</dd>
</dl>
<p>This paragraph is indented.</p>
<ol type="1">
<li>An ordered</li>
<li>list</li>
</ol>
<p>This paragraph is indented.</p>
</body>
</html>
208 changes: 208 additions & 0 deletions first-line-indent/expected_hi_3.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
% Options for packages loaded elsewhere
\PassOptionsToPackage{unicode}{hyperref}
\PassOptionsToPackage{hyphens}{url}
%
\documentclass[
]{article}
\title{Sample first line indent}
\author{}
\date{}

\usepackage{amsmath,amssymb}
\usepackage{lmodern}
\usepackage{iftex}
\ifPDFTeX
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{textcomp} % provide euro and other symbols
\else % if luatex or xetex
\usepackage{unicode-math}
\defaultfontfeatures{Scale=MatchLowercase}
\defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1}
\fi
% Use upquote if available, for straight quotes in verbatim environments
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\IfFileExists{microtype.sty}{% use microtype if available
\usepackage[]{microtype}
\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
}{}
\usepackage{xcolor}
\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available
\IfFileExists{bookmark.sty}{\usepackage{bookmark}}{\usepackage{hyperref}}
\hypersetup{
pdftitle={Sample first line indent},
hidelinks,
pdfcreator={LaTeX via pandoc}}
\urlstyle{same} % disable monospaced font for URLs
\usepackage{color}
\usepackage{fancyvrb}
\newcommand{\VerbBar}{|}
\newcommand{\VERB}{\Verb[commandchars=\\\{\}]}
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}}
% Add ',fontsize=\small' for more characters per line
\newenvironment{Shaded}{}{}
\newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{#1}}}
\newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
\newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{#1}}
\newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
\newcommand{\BuiltInTok}[1]{#1}
\newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{#1}}}
\newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
\newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{#1}}
\newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{#1}}}
\newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{#1}}
\newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
\newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{#1}}}
\newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{#1}}}
\newcommand{\ExtensionTok}[1]{#1}
\newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}}
\newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{#1}}
\newcommand{\ImportTok}[1]{#1}
\newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
\newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{#1}}}
\newcommand{\NormalTok}[1]{#1}
\newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}}
\newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{#1}}
\newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{#1}}
\newcommand{\RegionMarkerTok}[1]{#1}
\newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{#1}}
\newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{#1}}
\newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
\usepackage{longtable,booktabs,array}
\usepackage{calc} % for calculating minipage widths
% Correct order of tables after \paragraph or \subparagraph
\usepackage{etoolbox}
\makeatletter
\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{}
\makeatother
% Allow footnotes in longtable head/foot
\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}}
\makesavenoteenv{longtable}
\setlength{\emergencystretch}{3em} % prevent overfull lines
\providecommand{\tightlist}{%
\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
\setcounter{secnumdepth}{-\maxdimen} % remove section numbering
\setlength{\parindent}{2em}
\usepackage{lipsum}

\ifLuaTeX
\usepackage{selnolig} % disable illegal ligatures
\fi

\begin{document}
\maketitle

This sample tests the filter on a document with a metadata
header-includes of the MetaList type.

First paragraph. In English-style typography, the first paragraph
shouldn't have a first-line indent, nor the paragraphs below headers.

This paragraph should start with a first-line indent. But after this
quote:

\begin{quote}
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\end{quote}

\noindent the paragraph continues, so there should not be a first-line
indent.

The quote below ends a paragraph:

\begin{quote}
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\end{quote}

\indent This paragraph, then, is genuinely a new paragraph and starts
with a first-line indent.

\hypertarget{further-tests}{%
\section{Further tests}\label{further-tests}}

After a heading (in English typographic style) the paragraph does not
have a first-line indent.

In the couple couple of paragraphs that follow the quotes below, we have
manually specified \texttt{\textbackslash{}noindent} and
\texttt{\textbackslash{}indent} respectively. This is to check that the
filter doesn't add its own commands to those.

\begin{quote}
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\end{quote}

\noindent Manually specified no first line indent.

\indent Manually specified first line ident.

We can also check that indent is removed after lists:

\begin{itemize}
\tightlist
\item
A bullet
\item
list
\end{itemize}

\noindent And after code blocks:

\begin{Shaded}
\begin{Highlighting}[]
\KeywordTok{local}\NormalTok{ variable }\OperatorTok{=} \StringTok{"value"}
\end{Highlighting}
\end{Shaded}

\noindent Or horizontal rules.

\begin{center}\rule{0.5\linewidth}{0.5pt}\end{center}

\noindent In this document we added a few custom filter options. The
size of first-line indents is 2em instead of the standard 1em. We also
added an option to remove indent after tables:

\begin{longtable}[]{@{}rlcl@{}}
\caption{Demonstration of simple table syntax.}\tabularnewline
\toprule
Right & Left & Center & Default \\
\midrule
\endfirsthead
\toprule
Right & Left & Center & Default \\
\midrule
\endhead
12 & 12 & 12 & 12 \\
123 & 123 & 123 & 123 \\
1 & 1 & 1 & 1 \\
\bottomrule
\end{longtable}

\noindent So this paragraph's first line is not indented. And we
included custom options \emph{not} to remove ident after ordered lists
and definition lists:

\begin{description}
\tightlist
\item[Definition]
This is a definition block.
\end{description}

This paragraph is indented.

\begin{enumerate}
\def\labelenumi{\arabic{enumi}.}
\tightlist
\item
An ordered
\item
list
\end{enumerate}

This paragraph is indented.

\end{document}
6 changes: 3 additions & 3 deletions first-line-indent/first-line-indent.lua
Original file line number Diff line number Diff line change
@@ -82,10 +82,10 @@ local header_code = {
-- @return meta the modified metadata block
local function add_header_includes(meta, blocks)

local header_includes = pandoc.List(blocks)
local header_includes = pandoc.MetaList( { pandoc.MetaBlocks(blocks) })

-- add any exisiting meta['header-includes']
-- it could be a MetaList or a single String
-- it can be MetaInlines, MetaBlocks or MetaList
if meta['header-includes'] then
if meta['header-includes'].t == 'MetaList' then
header_includes:extend(meta['header-includes'])
@@ -94,7 +94,7 @@ local function add_header_includes(meta, blocks)
end
end

meta['header-includes'] = pandoc.MetaBlocks(header_includes)
meta['header-includes'] = header_includes

return meta

84 changes: 84 additions & 0 deletions first-line-indent/sample_head-inc_1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
---
title: "Sample first line indent"
# Filter options. These are defaults, you will get the same
# if you don't specify anything. See the README.md for details.
first-line-indent:
set-metadata-variable: true
set-header-includes: true
auto-remove: true
remove-after: Table
dont-remove-after:
- DefinitionList
- OrderedList
size: "2em"
# header-includes
header-includes: Raw header text
---

This sample tests the filter on a document with a metadata header-includes of the MetaInlines type.

First paragraph. In English-style typography, the first paragraph shouldn't have a first-line indent, nor the paragraphs below headers.

This paragraph should start with a first-line indent. But after this quote:

> Lorem ipsum dolor sit amet, consectetur adipiscing elit.
the paragraph continues, so there should not be a first-line indent.

The quote below ends a paragraph:

> Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\indent This paragraph, then, is genuinely a new paragraph and starts with
a first-line indent.

# Further tests

After a heading (in English typographic style) the paragraph does not have a first-line indent.

In the couple couple of paragraphs that follow the quotes below, we have manually specified `\noindent` and `\indent` respectively. This is to check that the filter doesn't add its own commands to those.

> Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\noindent Manually specified no first line indent.

\indent Manually specified first line ident.

We can also check that indent is removed after lists:

* A bullet
* list

And after code blocks:

```lua
local variable = "value"
```

Or horizontal rules.

---

In this document we added a few custom filter options. The size of first-line
indents is 2em instead of the standard 1em. We also added an option to remove indent after tables:

Right Left Center Default
------- ------ ---------- -------
12 12 12 12
123 123 123 123
1 1 1 1

Table: Demonstration of simple table syntax.

So this paragraph's first line is not indented. And we included custom options
*not* to remove ident after ordered lists and definition lists:

Definition
: This is a definition block.

This paragraph is indented.

1. An ordered
2. list

This paragraph is indented.
90 changes: 90 additions & 0 deletions first-line-indent/sample_head-inc_2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
---
title: "Sample first line indent"
# Filter options. These are defaults, you will get the same
# if you don't specify anything. See the README.md for details.
first-line-indent:
set-metadata-variable: true
set-header-includes: true
auto-remove: true
remove-after: Table
dont-remove-after:
- DefinitionList
- OrderedList
size: "2em"
# header-includes
header-includes: |
```{=latex}
\usepackage{lipsum}
```
```{=html}
<style>p {color:blue;}</style>
```
---

This sample tests the filter on a document with a metadata header-includes of the MetaBlocks type.

First paragraph. In English-style typography, the first paragraph shouldn't have a first-line indent, nor the paragraphs below headers.

This paragraph should start with a first-line indent. But after this quote:

> Lorem ipsum dolor sit amet, consectetur adipiscing elit.
the paragraph continues, so there should not be a first-line indent.

The quote below ends a paragraph:

> Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\indent This paragraph, then, is genuinely a new paragraph and starts with
a first-line indent.

# Further tests

After a heading (in English typographic style) the paragraph does not have a first-line indent.

In the couple couple of paragraphs that follow the quotes below, we have manually specified `\noindent` and `\indent` respectively. This is to check that the filter doesn't add its own commands to those.

> Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\noindent Manually specified no first line indent.

\indent Manually specified first line ident.

We can also check that indent is removed after lists:

* A bullet
* list

And after code blocks:

```lua
local variable = "value"
```

Or horizontal rules.

---

In this document we added a few custom filter options. The size of first-line
indents is 2em instead of the standard 1em. We also added an option to remove indent after tables:

Right Left Center Default
------- ------ ---------- -------
12 12 12 12
123 123 123 123
1 1 1 1

Table: Demonstration of simple table syntax.

So this paragraph's first line is not indented. And we included custom options
*not* to remove ident after ordered lists and definition lists:

Definition
: This is a definition block.

This paragraph is indented.

1. An ordered
2. list

This paragraph is indented.
92 changes: 92 additions & 0 deletions first-line-indent/sample_head-inc_3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
---
title: "Sample first line indent"
# Filter options. These are defaults, you will get the same
# if you don't specify anything. See the README.md for details.
first-line-indent:
set-metadata-variable: true
set-header-includes: true
auto-remove: true
remove-after: Table
dont-remove-after:
- DefinitionList
- OrderedList
size: "2em"
# header-includes
header-includes:
- |
```{=latex}
\usepackage{lipsum}
```
- |
```{=html}
<style>p {color:blue;}</style>
```
---

This sample tests the filter on a document with a metadata header-includes of the MetaList type.

First paragraph. In English-style typography, the first paragraph shouldn't have a first-line indent, nor the paragraphs below headers.

This paragraph should start with a first-line indent. But after this quote:

> Lorem ipsum dolor sit amet, consectetur adipiscing elit.
the paragraph continues, so there should not be a first-line indent.

The quote below ends a paragraph:

> Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\indent This paragraph, then, is genuinely a new paragraph and starts with
a first-line indent.

# Further tests

After a heading (in English typographic style) the paragraph does not have a first-line indent.

In the couple couple of paragraphs that follow the quotes below, we have manually specified `\noindent` and `\indent` respectively. This is to check that the filter doesn't add its own commands to those.

> Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\noindent Manually specified no first line indent.

\indent Manually specified first line ident.

We can also check that indent is removed after lists:

* A bullet
* list

And after code blocks:

```lua
local variable = "value"
```

Or horizontal rules.

---

In this document we added a few custom filter options. The size of first-line
indents is 2em instead of the standard 1em. We also added an option to remove indent after tables:

Right Left Center Default
------- ------ ---------- -------
12 12 12 12
123 123 123 123
1 1 1 1

Table: Demonstration of simple table syntax.

So this paragraph's first line is not indented. And we included custom options
*not* to remove ident after ordered lists and definition lists:

Definition
: This is a definition block.

This paragraph is indented.

1. An ordered
2. list

This paragraph is indented.