Perl script to add indentation (leading horizontal space) to LaTeX files. It can modify line breaks before, during and after code blocks; it can perform text wrapping and paragraph line break removal. It can also perform string-based and regex-based substitutions/replacements. The script is customisable through its YAML interface.
GNU General Public License v3.0
878
stars
83
forks
source link
Indentation is only 1 space after a section instead of 4 spaces like it is after all other headings. #438
\section{Overview}
This report analyzes the relationship between different aspects of a movie and its gross income.
These aspects include director list, actor list, runtime and so on.
To investigate these relationships, we looked at a comprehensive dataset compiled by the movie ranking website IMDB.com.
This dataset includes information about a movie like the director, the actors, the genre.
We found ..
yaml settings
#
# latexindent.pl, version 3.20.2, 2023-02-04
#
# defaultSettings.yaml, the default settings for latexindent.pl
#
# a script that aims to beautify .tex, .sty, .cls files
#
# (or latexindent.exe if you're on Windows)
#
#---------------------------------------------------------------------------------------
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# See http://www.gnu.org/licenses/.
#
# Chris Hughes, 2017
#
# For all communication, please visit: https://github.com/cmhughes/latexindent.pl
#
#---------------------------------------------------------------------------------------
# You should feel encouraged to change anything you like in these settings, but
# it would probably be better to have your own user settings
# files somewhere else - remember that this file may be overwritten
# when you update your tex distribution. Please see the manual linked from:
#
# https://github.com/cmhughes/latexindent.pl
#
# for details of how to create and configure your own settings files.
#
# Please read the manual (linked from above) first to understand what each switch does.
#
#---------------------------------------------------------------------------------------
# latexindent can be called to act on a file without using the file's extension,
# e.g, simply
# latexindent myfile
# in which case the choice of file extension is chosen
# according to the choices made in fileExtensionPreference
# Other file extensions can be added.
fileExtensionPreference:
.tex: 1
.sty: 2
.cls: 3
.bib: 4
# default file extension of backup file (if -w switch is active)
# for example, if your .tex file is called
# myfile.tex
# and you specify the backupExtension as BACKUP.bak then your
# backup file will be
# myfileBACKUP.bak
backupExtension: .bak
# only one backup per file:
# - if onlyOneBackUp is 0 then, as a safety measure,
# the number on the extension increments by 1 each time:
#
# myfile.bak0, myfile.bak1, myfile.bak2
# - if you set onlyOnebackUp to 1, then the backup file will
# be overwritten each time (not recommended until you trust the script)
onlyOneBackUp: 0
# some users may want a finite number of backup files,
# say at most 3; in which case, they can change this maxNumberOfBackUps.
#
# If maxNumberOfBackUps is set to 0 (or less) then infinitely
# many backups are possible, unless onlyOneBackUp is switched on
maxNumberOfBackUps: 0
# some users may wish to cycle through back up files.
#
# for example, with maxNumberOfBackUps: 4, they may
# wish to delete the oldest back up file, and keep only the most recent.
#
# copy myfile.bak1 to myfile.bak0
# copy myfile.bak2 to myfile.bak1
# copy myfile.bak3 to myfile.bak2
# copy myfile.bak4 to myfile.bak3
#
# the back up will be written to myfile.bak4
cycleThroughBackUps: 0
# preferences for information displayed in the log file
logFilePreferences:
showEveryYamlRead: 1
showAmalgamatedSettings: 0
showDecorationStartCodeBlockTrace: 0
showDecorationFinishCodeBlockTrace: 0
endLogFileWith: '--------------'
showGitHubInfoFooter: 1
Dumper:
Terse: 1
Indent: 1
Useqq: 1
Deparse: 1
Quotekeys: 0
Sortkeys: 1
Pair: " => "
# verbatim environments specified
# in this field will not be changed at all!
verbatimEnvironments:
verbatim: 1
lstlisting: 1
minted: 1
# verbatim commands such as \verb! body !, \lstinline$something else$
verbatimCommands:
verb: 1
lstinline: 1
mintinline: 1
# no indent blocks (not necessarily verbatim
# environments) which are marked as %\begin{noindent}
# or anything else that you detail in the following
noIndentBlock:
noindent: 1
cmhtest: 1
# \begin{document} and \end{document} are treated differently
# by latexindent within filecontents environments
fileContentsEnvironments:
filecontents: 1
filecontents*: 1
# indent preamble
indentPreamble: 0
# assume no preamble in cls, sty, by default
lookForPreamble:
.tex: 1
.sty: 0
.cls: 0
.bib: 0
# some preambles can contain \begin and \end statements
# that are not in their 'standard environment block', for example,
# consider the following key = values:
# preheadhook={\begin{mdframed}[style=myframedstyle]},
# postfoothook=\end{mdframed},
preambleCommandsBeforeEnvironments: 0
# default value of indentation
defaultIndent: " "
# remove trailing whitespace from all lines
removeTrailingWhitespace:
beforeProcessing: 0
afterProcessing: 1
# name of code blocks that should have their body aligned at ampersand delimiters
lookForAlignDelims:
tabular:
delims: 1
alignDoubleBackSlash: 1
spacesBeforeDoubleBackSlash: 1
multiColumnGrouping: 0
alignRowsWithoutMaxDelims: 1
spacesBeforeAmpersand: 1
spacesAfterAmpersand: 1
justification: left
alignFinalDoubleBackSlash: 0
dontMeasure: 0
delimiterRegEx: (?<!\\)(&)
delimiterJustification: left
lookForChildCodeBlocks: 1
tabularx: 1
xltabular: 1
longtable: 1
tabu: 1
array: 1
matrix: 1
listabla: 1
# amsmath
align: 1
align*: 1
alignat: 1
alignat*: 1
aligned: 1
bmatrix: 1
Bmatrix: 1
cases: 1
flalign: 1
flalign*: 1
pmatrix: 1
vmatrix: 1
Vmatrix: 1
# mathtools
cases*: 1
dcases: 1
dcases*: 1
rcases: 1
rcases*: 1
drcases: 1
drcases*: 1
# nicematrix
NiceTabular: 1
NiceMatrix: 1
pNiceMatrix: 1
bNiceMatrix: 1
BNiceMatrix: 1
vNiceMatrix: 1
VNiceMatrix: 1
NiceArray: 1
pNiceArrayC: 1
bNiceArrayC: 1
BNiceArrayC: 1
vNiceArrayC: 1
VNiceArrayC: 1
NiceArrayCwithDelims: 1
pNiceArrayRC: 1
bNiceArrayRC: 1
BNiceArrayRC: 1
vNiceArrayRC: 1
VNiceArrayRC: 1
NiceArrayRCwithDelims: 1
# tabularray
tblr: 1
longtblr: 1
talltblr: 1
# if you want the script to look for \item commands
# and format it, as follows (for example),
# \begin{itemize}
# \item content here
# next line is indented
# next line is indented
# \item another item
# \end{itemize}
# then populate indentAfterItems. See also itemNames
indentAfterItems:
itemize: 1
itemize*: 1
enumerate: 1
enumerate*: 1
description: 1
description*: 1
list: 1
# if you want to use other names for your items (for example, \part)
# then populate them here; note that you can trick latexindent.pl
# into indenting all kinds of commands (within environments specified in
# indentAfterItems) using this technique.
itemNames:
item: 1
# specialBeginEnd is, by default, mathmode focus, although
# there's no restrictions
specialBeginEnd:
displayMath:
begin: (?<!\\)\\\[ # \[ but *not* \\[
end: \\\] # \]
lookForThis: 1
inlineMath:
begin: (?<!\$)(?<!\\)\$(?!\$) # $ but *not* \$ or $$
end: (?<!\\)\$(?!\$) # $ but *not* \$ or $$
lookForThis: 1
displayMathTeX:
begin: \$\$ # $$
end: \$\$ # $$
lookForThis: 1
specialBeforeCommand: 0
# if you want to add indentation after
# a heading, such as \part, \chapter, etc
# then populate it in here - you can add
# an indent rule to indentRules if you would
# like something other than defaultIndent
#
# you can also change the level if you like,
# or add your own title command
indentAfterHeadings:
part:
indentAfterThisHeading: 1
level: 1
chapter:
indentAfterThisHeading: 1
level: 2
section:
indentAfterThisHeading: 1
level: 3
subsection:
indentAfterThisHeading: 1
level: 4
subsubsection:
indentAfterThisHeading: 1
level: 5
paragraph:
indentAfterThisHeading: 1
level: 6
subparagraph:
indentAfterThisHeading: 1
level: 7
# maximum indentation, off by default
maximumIndentation: -1
# if you don't want to have additional indentation
# in a code block, then add it to noAdditionalIndent; note that
# code blocks in this field will inherit
# the *current* level of indentation they just won't
# get any *additional* indentation
noAdditionalIndent:
myexample: 1
mydefinition: 1
problem: 1
exercises: 1
mysolution: 1
foreach: 0
widepage: 1
comment: 1
document: 1
frame: 0
# if you have indent rules for particular code blocks
# then you can populate them in indentRules; for example, you might just want
# to use a space " " or maybe a double tab "\t\t"
indentRules:
item: " "
# set noAdditionalIndent globally for codeblocks
noAdditionalIndentGlobal:
environments: 0 # 0/1
commands: 1 # 0/1
optionalArguments: 0 # 0/1
mandatoryArguments: 0 # 0/1
ifElseFi: 0 # 0/1
items: 0 # 0/1
keyEqualsValuesBracesBrackets: 0 # 0/1
namedGroupingBracesBrackets: 0 # 0/1
UnNamedGroupingBracesBrackets: 0 # 0/1
specialBeginEnd: 0 # 0/1
afterHeading: 0 # 0/1
filecontents: 0 # 0/1
# set indentRules globally for codeblocks; these need
# to be horizontal spaces, if they are to be used
indentRulesGlobal:
environments: 0 # 0/h-space
commands: 0 # 0/h-space
optionalArguments: 0 # 0/h-space
mandatoryArguments: 0 # 0/h-space
ifElseFi: 0 # 0/h-space
items: 0 # 0/h-space
keyEqualsValuesBracesBrackets: 0 # 0/h-space
namedGroupingBracesBrackets: 0 # 0/h-space
UnNamedGroupingBracesBrackets: 0 # 0/h-space
specialBeginEnd: 0 # 0/h-space
afterHeading: 0 # 0/h-space
filecontents: 0 # 0/h-space
# command code block details
commandCodeBlocks:
roundParenthesesAllowed: 1
stringsAllowedBetweenArguments:
-
amalgamate: 1
- node
- at
- to
- decoration
- \+\+
- \-\-
- \#\#\d
commandNameSpecial:
-
amalgamate: 1
- '@ifnextchar\['
# change dos line breaks into unix
dos2unixlinebreaks: 1
# modifyLineBreaks will only be searched if the -m
# switch is active
#
# poly-switch examples:
#
# BeginStartsOnOwnLine:
# modify line breaks before a begin statement
#
# when set to -1, e.g
# some text some text
# \begin{myenvironment}
# will be changed to
# some text some text \begin{myenvironment}
# when set to 0, the switch is ignored
# when set to 1, e.g
# some text some text \begin{myenvironment}
# will be changed to
# some text some text
# \begin{myenvironment}
# when set to 2, e.g
# some text some text \begin{myenvironment}
# will be changed to
# some text some text%
# \begin{myenvironment}
# when set to 3, e.g
# some text some text \begin{myenvironment}
# will be changed to
# some text some text
#
# \begin{myenvironment}
#
# BodyStartsOnOwnLine:
# modify line breaks before the beginning of the body
#
# when set to -1, e.g
# \begin{myenv}
# body text body text
# will be changed to
# \begin{myenv}body text body text
# when set to 0, the switch is ignored
# when set to 1, e.g
# \begin{myenv}body text body text
# will be changed to
# \begin{myenv}
# body text body text
# when set to 2, e.g
# \begin{myenv}body text body text
# will be changed to
# \begin{myenv}%
# body text body text
# when set to 3, e.g
# \begin{myenv}body text body text
# will be changed to
# \begin{myenv}
#
# body text body text
#
# EndStartsOnOwnLine:
# modify line breaks before the end statement
#
# when set to -1, e.g
# some text some text
# \end{myenvironment}
# will be changed to
# some text some text \end{myenvironment}
# when set to 0, the switch is ignored
# when set to 1, e.g
# some text some text \end{myenvironment}
# will be changed to
# some text some text
# \end{myenvironment}
# when set to 2, e.g
# some text some text \end{myenvironment}
# will be changed to
# some text some text%
# \end{myenvironment}
# when set to 3, e.g
# some text some text \end{myenvironment}
# will be changed to
# some text some text
#
# \end{myenvironment}
#
# EndFinishesWithLineBreak:
# modify line breaks after the end statement
#
# when set to -1, e.g
# \end{myenvironment}
# some text some text
# will be changed to
# \end{myenvironment}some text some text
# when set to 0, the switch is ignored
# when set to 1, e.g
# \end{myenvironment}some text some text
# will be changed to
# \end{myenvironment}
# some text some text
# when set to 2, e.g
# \end{myenvironment}some text some text
# will be changed to
# \end{myenvironment}%
# some text some text
# when set to 3, e.g
# \end{myenvironment}some text some text
# will be changed to
# \end{myenvironment}
#
# some text some text
#
# you can specify settings on a per-name basis
modifyLineBreaks:
preserveBlankLines: 1 # 0/1
condenseMultipleBlankLinesInto: 1 # 0/1
oneSentencePerLine:
manipulateSentences: 1 # 0/1
removeSentenceLineBreaks: 1 # 0/1
multipleSpacesToSingle: 1 # 0/1
textWrapSentences: 1 # 1 disables main textWrap
sentenceIndent: " "
sentencesFollow:
par: 1 # 0/1
blankLine: 1 # 0/1
fullStop: 1 # 0/1
exclamationMark: 1 # 0/1
questionMark: 1 # 0/1
rightBrace: 1 # 0/1
commentOnPreviousLine: 1 # 0/1
other: 0 # regex
sentencesBeginWith:
A-Z: 1 # 0/1
a-z: 0 # 0/1
other: 0 # regex
sentencesEndWith:
basicFullStop: 0 # 0/1
betterFullStop: 1 # 0/1
exclamationMark: 1 # 0/1
questionMark: 1 # 0/1
other: |- # regex
\\inputminted(?:\[.*\])?\{.*\}\{.+\}|:\s?\n
textWrapOptions:
columns: 80
multipleSpacesToSingle: 1
removeBlockLineBreaks: 1
when: before # before/after
comments:
wrap: 1 # 0/1
inheritLeadingSpace: 1 # 0/1
blocksFollow:
headings: 1 # 0/1
commentOnPreviousLine: 1 # 0/1
par: 1 # 0/1
blankLine: 1 # 0/1
verbatim: 1 # 0/1
filecontents: 1 # 0/1
other: |- # regex
(?x)
\\\]
|
\\item(?:\h|\[)
|
\\begin\{itemize|enumerate\}
|
\\end\{itemize|enumerate\}
blocksBeginWith:
a-z: 1 # 0/1
A-Z: 1 # 0/1
0-9: 1 # 0/1
other: 0 # regex
blocksEndBefore:
commentOnOwnLine: 1 # 0/1
verbatim: 1 # 0/1
filecontents: 1 # 0/1
other: \\begin\{|\\\[|\\end\{ # regex
huge: overflow # forbid mid-word line breaks
separator: ""
# poly-switches below here -1: remove, 0: off, 1: add, 2: comment+add, 3: add blank line, 4: add blank line
environments:
BeginStartsOnOwnLine: 1 # -1,0,1,2,3,4
BodyStartsOnOwnLine: 1 # -1,0,1,2,3,4
EndStartsOnOwnLine: 1 # -1,0,1,2,3,4
EndFinishesWithLineBreak: 1 # -1,0,1,2,3,4
equation*:
BeginStartsOnOwnLine: 0 # -1,0,1,2,3,4
BodyStartsOnOwnLine: 0 # -1,0,1,2,3,4
EndStartsOnOwnLine: 0 # -1,0,1,2,3,4
EndFinishesWithLineBreak: 0 # -1,0,1,2,3,4
ifElseFi:
IfStartsOnOwnLine: 0 # -1,0,1,2,3,4
BodyStartsOnOwnLine: 0 # -1,0,1,2,3,4
OrStartsOnOwnLine: 0 # -1,0,1,2,3,4
OrFinishesWithLineBreak: 0 # -1,0,1,2,3,4
ElseStartsOnOwnLine: 0 # -1,0,1,2,3,4
ElseFinishesWithLineBreak: 0 # -1,0,1,2,3,4
FiStartsOnOwnLine: 0 # -1,0,1,2,3,4
FiFinishesWithLineBreak: 0 # -1,0,1,2,3,4
ifnum:
IfStartsOnOwnLine: 0 # -1,0,1,2,3,4
BodyStartsOnOwnLine: 0 # -1,0,1,2,3,4
OrStartsOnOwnLine: 0 # -1,0,1,2,3,4
OrFinishesWithLineBreak: 0 # -1,0,1,2,3,4
ElseStartsOnOwnLine: 0 # -1,0,1,2,3,4
ElseFinishesWithLineBreak: 0 # -1,0,1,2,3,4
FiStartsOnOwnLine: 0 # -1,0,1,2,3,4
FiFinishesWithLineBreak: 0 # -1,0,1,2,3,4
commands:
CommandStartsOnOwnLine: 0
CommandNameFinishesWithLineBreak: 0
optionalArguments:
LSqBStartsOnOwnLine: 0 # -1,0,1,2,3,4
OptArgBodyStartsOnOwnLine: 0 # -1,0,1,2,3,4
RSqBStartsOnOwnLine: 0 # -1,0,1,2,3,4
RSqBFinishesWithLineBreak: 0 # -1,0,1,2,3,4
mandatoryArguments:
LCuBStartsOnOwnLine: 0 # -1,0,1,2,3,4
MandArgBodyStartsOnOwnLine: 0 # -1,0,1,2,3,4
RCuBStartsOnOwnLine: 0 # -1,0,1,2,3,4
RCuBFinishesWithLineBreak: 0 # -1,0,1,2,3,4
keyEqualsValuesBracesBrackets:
KeyStartsOnOwnLine: 0 # -1,0,1,2,3,4
EqualsStartsOnOwnLine: 0 # -1,0,1,2,3,4
EqualsFinishesWithLineBreak: 0 # -1,0,1,2,3,4
items:
ItemStartsOnOwnLine: 1 # -1,0,1,2,3,4
ItemFinishesWithLineBreak: 0 # -1,0,1,2,3,4
namedGroupingBracesBrackets:
NameStartsOnOwnLine: 0 # -1,0,1,2,3,4
NameFinishesWithLineBreak: 0 # -1,0,1,2,3,4
specialBeginEnd:
SpecialBeginStartsOnOwnLine: 0 # -1,0,1,2,3,4
SpecialBodyStartsOnOwnLine: 0 # -1,0,1,2,3,4
SpecialEndStartsOnOwnLine: 0 # -1,0,1,2,3,4
SpecialEndFinishesWithLineBreak: 0 # -1,0,1,2,3,4
verbatim:
VerbatimBeginStartsOnOwnLine: 0 # -1,0,1,2,3,4
VerbatimEndFinishesWithLineBreak: 0 # -1,0,1,2,3,4
# replacements, only active when either -r or -rr switches are active
replacements:
-
amalgamate: 1
-
this: latexindent.pl
that: pl.latexindent
lookForThis: 0
when: before
# fineTuning allows you to tweak the internal pattern matching that
# is central to latexindent.pl
fineTuning:
environments:
name: [a-zA-Z@\*0-9_\\]+
ifElseFi:
name: (?!@?if[a-zA-Z@]*?\{)@?if[a-zA-Z@]*?
commands:
name: [+a-zA-Z@\*0-9_\:]+?
items:
canBeFollowedBy: (?:\[[^]]*?\])|(?:<[^>]*?>)
keyEqualsValuesBracesBrackets:
name: [a-zA-Z@\*0-9_\/.:\#-]+[a-zA-Z@\*0-9_\/.\h\{\}:\#-]*?
follow: (?:(?<!\\)\{)|,|(?:(?<!\\)\[)
namedGroupingBracesBrackets:
name: [0-9\.a-zA-Z@\*><]+?
follow: \h|\R|\{|\[|\$|\)|\(
UnNamedGroupingBracesBrackets:
follow: \{|\[|,|&|\)|\(|\$
arguments:
before: (?:#\d\h*;?,?\/?)+|\<.*?\>
between: _|\^|\*
trailingComments:
notPreceededBy: (?<!\\)
modifyLineBreaks:
doubleBackSlash: \\\\(?:\h*\[\h*\d+\h*[a-zA-Z]+\h*\])?
comma: ','
betterFullStop: |-
(?x) # ignore spaces in the below
(?: #
\.\) # .)
(?!\h*[a-z]) # not *followed by* a-z
) #
| # OR
(?: #
(?<! # not *preceded by*
(?: #
(?:[eE]\.[gG]) # e.g OR E.g OR e.G OR E.G
| #
(?:[iI]\.[eE]) # i.e OR I.e OR i.E OR I.E
| #
(?:etc) # etc
) #
) #
) #
\. # .
(?! # not *followed by*
(?: #
[a-zA-Z0-9-~,./] #
| #
\), # ),
| #
\)\. # ).
) #
) #
actual/given output
\section{Overview}
This report analyzes the relationship between different aspects of a movie and
its gross income.
These aspects include director list, actor list, runtime and so on.
To investigate these relationships, we looked at a comprehensive dataset
compiled by the movie ranking website IMDB.com.
This dataset includes information about a movie like the director, the actors,
the genre.
We found ..
desired or expected output
\section{Overview}
This report analyzes the relationship between different aspects of a movie and
its gross income.
These aspects include director list, actor list, runtime and so on.
To investigate these relationships, we looked at a comprehensive dataset
compiled by the movie ranking website IMDB.com.
This dataset includes information about a movie like the director, the actors,
the genre.
We found ..
anything else
I can't work out why the indentation after \section{} is just a space instead of 4 spaces as defined in the config. Other headings like \subsection{} or \paragraph{} indent correctly.
I don't think the config has changed, but after updating latexindent from 3.20.2 (I think it was that version) to 3.20.4, it's started doing this.
P.S. Sorry the config is so long, I copied the default settings then edited them to make that file, and I don't know where the issue is.
original .tex code
yaml settings
actual/given output
desired or expected output
anything else
I can't work out why the indentation after
\section{}
is just a space instead of 4 spaces as defined in the config. Other headings like\subsection{}
or\paragraph{}
indent correctly. I don't think the config has changed, but after updating latexindent from3.20.2
(I think it was that version) to3.20.4
, it's started doing this.P.S. Sorry the config is so long, I copied the default settings then edited them to make that file, and I don't know where the issue is.