diff --git a/pandocomatic-elsarticle.yaml b/pandocomatic-elsarticle.yaml index 10064e1..41d2e2b 100644 --- a/pandocomatic-elsarticle.yaml +++ b/pandocomatic-elsarticle.yaml @@ -47,8 +47,10 @@ templates: # Elsevier only accepts natbib, hence: natbib: true # - enable natbib, and citeproc: false # - turn off the citeproc CSL engine. - bibliography: ./test_elsarticle.bib # The name of your bib-file. Respect - # the directory naming conventions of pandocomatic. + bibliography: ./src/bib/CitedByMe-2021-swSemantics.bib # The name of your + # bib-file. Respect the directory naming + # conventions of pandocomatic. DON'T USE + # UNDERSCORES IN THE BIBNAME citation-abbreviations: cite-abbr.json # Journal abbreviations reference-links: true # Refer to pandoc manual. metadata: @@ -61,9 +63,13 @@ templates: link-citations: true # Refer to pandoc manual, section `Other # relevant metadata fields`. Deactivate this for # paper print. +#----------------------------------------------------------------------------- + version: + preprocessor: + - preprocessors/preludeGitVersion.py #----------------------------------------------------------------------------- elsevier: - extends: ['natbib-refs'] + extends: ['natbib-refs','version'] pandoc: verbose: true from: markdown @@ -72,12 +78,15 @@ templates: filter: - filters/assimilateMetadata.rb # Handle academic metadata. template: elsarticle.latex # Latex template supporing elsarticle.cls - include-in-header: './addstyles.sty' # To easily include packages; refer + include-in-header: './../../templates/addstyles.sty' # To easily include packages; refer # to elsarticle.latex metadata: documentclass: 'elsarticle' # Specifying Elsevier's documentclass. + twocolumn: true # Single column (False) or double column (True) style. + # DO NOT include 'twocolumn' in the classoption parameter; + # that will be taken care of by this parameter. classoption: ['preprint','authoryear','3p'] # Elsevier defines - # several options for their various journal styles. + # several more options for their various journal styles. # classoption: ['sort&compress','preprint','authoryear','3p'] # # The `sort&compress` fails on the `&`; refer # to elsarticle.latex @@ -85,17 +94,4 @@ templates: # biboptions: [longnamesfirst,angle,semicolon] # Add extra options of natbib.sty colorlinks: true # Deactivate this for paper print. lang: 'en-GB' -#----------------------------------------------------------------------------- - elsevier-1col: # FOR TESTING PURPOSES ONLY - extends: ['elsevier'] - pandoc: - output: test_elsarticle_1col.tex - metadata: - classoption: ['preprint','authoryear','3p'] # Single column style. -#----------------------------------------------------------------------------- - elsevier-2col: # FOR TESTING PURPOSES ONLY - extends: ['elsevier'] - pandoc: - output: test_elsarticle_2col.tex - metadata: - classoption: ['preprint','authoryear','3p','twocolumn'] # Double column style. +#----------------------------------------------------------------------------- \ No newline at end of file diff --git a/preprocessors/preludeGitVersion.md b/preprocessors/preludeGitVersion.md new file mode 100644 index 0000000..0a1ff15 --- /dev/null +++ b/preprocessors/preludeGitVersion.md @@ -0,0 +1,69 @@ +# preludeGitVersion + +Bump the document version and adds/replaces the version: major.minor-commits to the (piped) document. + +## GIT and versioning: +* The major demand that we have is to assure that our work is being saved in git, in order to prevent loosing our work when crashes occur. The minor demand that we have is to support versioning of saved work. +* Similar to sw-testing, unsuccessful pdf generation by pandocomatic is independent from versioning. We only want to commit a verified piece of work, i.e., all tests passed. Then, and only then, we want to have a bumped version denoted in the document. +* We want to have each and every committed progress versioned without the need to actively take action for that. This is easy since git will bump the release (the number of commits, placed after the first dash) automatically. +* We want to be able to (actively) indicate that the bumped version is a major, minor or patch. + +## THE PROBLEM +Generating a document with pandocomatic into your choice of output, e.g., pdf, precedes the process of committing the latest generated document to git. Only when committing the document with git, the git version will be bumped. However, we need that bumped git version while generating the document, since that is the latest moment we can include that new version into our document. A classical catch-22. + +## OBJECTIVE +To include the to-be-bumped version into the document generation process, prelude the git version that will result from eventually committing the new document. + +## METHOD +* Step 1: Assume the document-to-generate is commit-worthy, i.e., exactly as we want it. We thus anticipate a successful git commit after document generation. This implies to simulate a version bump, to be included in the document. The git version itself remains unaltered until we actually perform a 'git commit'. +* Step 2: As we start the pandocomatic document generation, we don't know whether the document will show as commit-worthy. Two cases apply: + * First, our assumption fails and the document is erroneous or otherwise not to our liking: no matter what we have preluded as version-to-be, no harm to the actual git versioning is done. Consequently, we can repeat the preludation process time after time as long as we make sure that we don't retain the version-to-be but start fresh with the latest git version as seed to the preluding; + * Second, our assumption holds and we've generated a valid, commit-able document. The preluded version has been included in the document itself, however, the document is yet to be committed. Consequently, after the 'git commit' the actual git version has been bumped, and is in correspondence with the preluded version that has been included in the document. + +## ADVANCED METHOD +Assume we not only want to apply versioning on the level of patches, viz the number of commits, but also on the other two levels. In order to align/match the preluded version as included in the document with the actual git version, it is the responsibility of the user to foretell the type of versioning of the commit already during document processing, and include this as proper parameter to the preludeGitVersion process. In case of a major or minor version bump, we need to tell git that we don't want a patch-level bump but a major or minor instead. Besides, we need to instruct git with the tag command to create a new tag at the correct level. + +## USAGE + +### Prerequisites + +The folder that contains your `project.scriv` must be under git control and, hence, contain the `.git` folder. + +### Testing + +From the command line, one can test the proper operation of the command: input your markdown document into the command by pipe (```cat document.md```) and it will output the result back to the command line. The result is the very same markdown document, but modified to include a + + version: x.y-z + +line in its YAML-block. + +``` +usage: preludeGitVersion.py [-h] [-p PATH] [-i {commit,minor,major}] + + -h, --help show this help message and exit + -p PATH, --path PATH the path name to the local directory that + includes the document git repo; + default = "./" + -i {commit,minor,major}, --increment {commit,minor,major} + indicates which version field is to be + bumped (major.minor-commits), preluding + the actual commit; + default = "commit" +``` + +### Integrated into the pandocomatic process line +In your ```document.md```, include a yaml block on top, as follows: +``` +pandocomatic_: + preprocessors: ['preprocessors/preludeGitVersion.py’] + ... +... +version-incr: commit # major, minor or commit +... +``` +This specifies to use the ```preludeGitVersion``` preprocessor, and indicates to prelude on the version-level of your choice (major.minor-commit). The result of the preprocessor will be piped into pandocomatic for processing. + +Logging can be found in ./preludeGitVersion.log + +## RULES +* Command line arguments take precedence over YAML-block arguments (this is mostly for testing purposes) \ No newline at end of file diff --git a/preprocessors/preludeGitVersion.py b/preprocessors/preludeGitVersion.py new file mode 100755 index 0000000..0c16060 --- /dev/null +++ b/preprocessors/preludeGitVersion.py @@ -0,0 +1,191 @@ +#!/usr/local/bin/python3 +import datetime +import logging +import sys + +import git.exc +from git import Repo + + +def parseInput(): + import argparse + default = {} + default['-p'] = './' + default['-i'] = '' + + # Get all arguments and ACK the command + parser = argparse.ArgumentParser( + description='''Bump the document version and adds/replaces the version: mjr.mnr-commits to the (piped) document.''', + epilog='''OBJECTIVE: When the documents are managed by git, git commits are executed *after* document \n + generation in order to prevent erroneous docs to end up in git. Therefore, the current git version the \n + document is tagged with, denotes the version of the previous document. To end up with correct versioning, \n + the version to be inserted in the current document must prelude the git version. \n + METHOD: We assume the document-to-generate is commit-worthy, and we thus anticipate a successful git \n + commit after document generation. This implies to simulate a version bump, to be included in the document. \n + Because we simulate the git bump, the git version itself remains unaltered. Two cases apply: \n + First, whenever our assumption fails and the document is erroneous, no harm to the actual git versioning \n + is done and we can repeat the process time after time until the document is correct; \n + Second, for a valid, commit-able document the version bump is now included in the document itself, however, \n + the document is yet to be committed (resulting in an actual git version bump). In order to align/match the \n + documented version with the actual git version, it is the responsibility of the user to foretell the type \n + of versioning of the commit during document processing, and include this as proper \n + parameter to the preludeGitVersion process.\n + RULES: command line arguments take precedence over YAML-block arguments + ''' + ) + parser.add_argument('-p', '--path', + help='''the path name to the local directory that + includes the document git repo; default = "{}"'''.format(default['-p']), + default=default['-p'] + ) + parser.add_argument('-i', '--increment', + choices=['commit', 'minor', 'major'], + help='indicates which version field is bumped (major.minor-commits), preluding the actual commit; default = "commit"' + ) + + args = parser.parse_args() + return args.path, args.increment + + +def getGitVersion(dir="./"): + try: + repo = Repo(dir, search_parent_directories=False) + except git.exc.InvalidGitRepositoryError as err: + print( + "Error: git repository {} not found - Create an empty Git repository or reinitialize an existing one with 'git init' ({})".format( + dir + '.git/', sys.argv[0]), file=sys.stderr) + exit(1) + + if repo.bare: + version, commits, hash = "v0.0", "0", "" + repo.create_tag(version, message="initial tag") + logging.info("current git is bare git, hence version tag created: {}".format(version)) + else: + describe = repo.git.describe("--tags") + logging.info("current git version: {}".format(describe)) + if "-" in describe: + version, commits, hash = describe.split('-') + hash = hash[1:] + else: + version = describe + commits = "0" + hash = "" + + return version + '-' + commits, hash + + +def incrementGitVersion(git_path="", incr_field="", yaml_version=""): + assert (git_path and incr_field), "Expected path/to/.git and the field to increment" + # Get current git status information + git_version, git_hash = getGitVersion(git_path) + + # Assume a YAML version trumps a git version + if yaml_version and not yaml_version.isspace(): + logging.info("Using version from yaml-block ({})".format(yaml_version)) + return incrementVersion(yaml_version, incr_field) + else: + logging.info("Using version found in git ({})".format(git_version)) + return incrementVersion(git_version, incr_field) + + +def incrementVersion(version, incr="commit"): + import re + reVersionFormat = re.compile(r'v(?P\d+)\.(?P\d+)(-(?P\d+))?') + reresult = reVersionFormat.match(version) + assert reresult, "Error: version expected, got {}".format(version) + assert incr in ["major", "minor", "commit"], "Error: increment 'major', 'minor', or 'commit' expected, got {}".format(incr) + logging.info("Incrementing version {} on level '{}'".format(version,incr)) + major = int(reresult.group("mjr")) + minor = int(reresult.group("mnr")) + commits = int(reresult.group("cmts")) if reresult.group("cmts") else 0 + + if incr == "commit": + commits += 1 + elif incr == "minor": + commits = 0 + minor += 1 + elif incr == "major": + commits = 0 + minor = 0 + major += 1 + logging.info("Continuing with version {}".format("v" + str(major) + "." + str(minor) + '-' + str(commits))) + + return "v" + str(major) + "." + str(minor) + '-' + str(commits) + + +def extractYAMLBlock(text): + import re + p0 = re.compile(r'^(---)[ ]*$(\n|\r)(?P(^.*$(\n|\r))*?)(---|\.\.\.)[\s]*$', re.MULTILINE) + yaml = p0.match(text) + return yaml[p0.groupindex['yaml']] + + +def extractVersionData(text): + import re + regexIncr = r'^version-incr[ ]*:\s*(?Pmajor|minor|commit)\s*(#.*)?$' + regexVersion = r'^version[ ]*:\s*(?P[\S*]*?)\s*(#.*)?$' + incr = re.search(regexIncr, text, re.MULTILINE) + vers = re.search(regexVersion, text, re.MULTILINE) + return vers.group('vers') if vers else None, incr.group('incr') if incr else None + + +def yamlSub(text=None, label=None, newvalue=None): + import re + assert label in ("version", "version-incr"), "YAML parameter 'version' or 'version-incr' expected, got {}".format( + label) + assert text, "YAML substitution for parameter '{}' requires a text in-place to substitute in".format(label) + assert newvalue, "YAML parameter '{}' requires new value, got {}".format(label, newvalue) + pattern = re.compile(r'^' + label + r'\s*:[\s*\S*]*?\s*(#.*)?$', re.MULTILINE) + return pattern.sub("{}: {}".format(label, newvalue), text) + + +def modifyDocument(git_path=None, arg_incr_field=None, file=None): + import re + + # Extract YAML intended versioning information + yaml_start = re.compile(r'^(---)[ ]*$', re.MULTILINE) + # Read the text, either from file or from pipe + text = "" + if file: + with open(file) as f: + text = ''.join(f.readlines()) + else: + text = ''.join(sys.stdin.readlines()) + assert text, "Empty input. Provide markdown text, either in file or by pipe." + + yamlVersion, yamlIncr = extractVersionData(extractYAMLBlock(text)) + if yamlIncr: + logging.info("== Found increment level in YAML-block: {}".format(yamlIncr)) + + # Command line arguments take precedence over yaml values + incr_field = (arg_incr_field if arg_incr_field else yamlIncr) + logging.info("== Set increment level: {}".format(incr_field)) + + newtext = yamlSub(text, "version-incr", incr_field) if incr_field else text + if yamlVersion: + logging.info("== Found version in YAML-block: {}".format(yamlVersion)) + newtext = yamlSub(newtext, "version", incrementGitVersion(git_path, incr_field, yamlVersion)) + else: + newtext = yaml_start.sub("---\nversion: {}".format(incrementGitVersion(git_path, incr_field, "")), newtext, count=1) + return newtext + + +if __name__ == '__main__': + import os + from pathlib import Path + + cwd = os.getcwd() + logfile = cwd + '/' + Path(sys.argv[0]).stem + '.log' + logging.basicConfig(filename=logfile, + encoding='utf-8', + level=logging.DEBUG, + filemode='w') + logging.info("======= running {} =========".format(sys.argv[0])) + logging.info("== {}".format(datetime.datetime.now().strftime("%c"))) + + # init: read command line arguments + git_path, incr_field = parseInput() + logging.info("== Path/to/.git: {}".format(git_path)) + logging.info("== Increment level at command line: {}".format(incr_field if incr_field else 'None')) + + print(modifyDocument(git_path, incr_field)) diff --git a/templates/elsarticle.latex b/templates/elsarticle.latex index bba8b95..c94a2ad 100644 --- a/templates/elsarticle.latex +++ b/templates/elsarticle.latex @@ -60,7 +60,7 @@ %% %%%%%%%%%%%%% -\documentclass[sort&compress,$for(classoption)$$classoption$$sep$,$endfor$]{$documentclass$} +\documentclass[sort&compress,$for(classoption)$$classoption$$sep$,$endfor$$if(twocolumn)$,twocolumn$endif$]{$documentclass$} %% %% !Todo!: Resolve the conflicting `&` in `sort&compress` when parameterized as %% `classoption` in pandocomatic-elsarticle.yaml configuration. @@ -113,9 +113,10 @@ $endif$ %% %% Elsevier bibliography styles %% ---------------------------- -%% +%% Elsevier requires natbib. +\usepackage[authoryear]{natbib} +\setcitestyle{authoryear,open={(},close={)}} %Citation-related commands; modify for your convenience. $if(bst-file)$\bibliographystyle{$bst-file$}$endif$ -\setcitestyle{authoryear,open={(},close={)}} %Citation-related commands %% Add extra options of natbib.sty, if any specified. $if(biboptions)$\biboptions{$for(biboptions)$$biboptions$$sep$,$endfor$}$endif$ %% @@ -136,7 +137,8 @@ $if(biboptions)$\biboptions{$for(biboptions)$$biboptions$$sep$,$endfor$}$endif$ %% environments. This floats the environment to the top/bottom of page over %% both columns. %% Source: https://tex.stackexchange.com/questions/89462/page-wide-table-in-two-column-mode -%% Hence, redefine those environments: +%% Hence, redefine those environments when 'twocolumn' has been specified +$if(twocolumn)$ \makeatletter \renewenvironment{figure}{% \begin{figure*} @@ -144,9 +146,16 @@ $if(biboptions)$\biboptions{$for(biboptions)$$biboptions$$sep$,$endfor$}$endif$ \end{figure*} } \makeatother +\makeatletter +\renewenvironment{table}{% + \begin{table*} + }{% + \end{table*} + } +\makeatother %% -%% - Longtable does not work well with multicolumns. Therefore, -%% redefine the longtable environment to enforce a single column mode before +%% - Longtable & xltabular do not work well with multicolumns. Therefore, +%% redefine these environments to enforce a single column mode before %% its definition, and restore the two-column mode afterwards: \usepackage{stackengine} % !!See Note (1) at the bottom!! \usepackage{xltabular} % Include longtable with column specifier X as in tabularx @@ -155,10 +164,19 @@ $if(biboptions)$\biboptions{$for(biboptions)$$biboptions$$sep$,$endfor$}$endif$ % good table in this context. \usepackage{etoolbox} % Used for the \BeforeBegin- & \AfterEndEnvironment \BeforeBeginEnvironment{longtable}{% - \onecolumn% + \onecolumn% } \AfterEndEnvironment{longtable}{% - \twocolumn% + \twocolumn% +} +\AtBeginEnvironment{longtable}{% + \scriptsize% +} +\BeforeBeginEnvironment{xltabular}{% + \onecolumn% +} +\AfterEndEnvironment{xltabular}{% + \twocolumn% } %% This is not an optimal solution since it can result in pages around the %% longtables that are partly blank unintentionally. Other solutions to @@ -168,6 +186,7 @@ $if(biboptions)$\biboptions{$for(biboptions)$$biboptions$$sep$,$endfor$}$endif$ %% !ToDo!: Make this part conditional on the documentclass-defined one- or %% two-column mode. That is, only include it when necessary. %% +$endif$ %% %%%%%%%%%%%%% end REQUIRED PACKAGES @@ -180,17 +199,21 @@ $if(biboptions)$\biboptions{$for(biboptions)$$biboptions$$sep$,$endfor$}$endif$ %% elsarticle.cls. If you prefer to use the old commands %% please give \usepackage{epsfig} +$if(modulolineno)$ %% The lineno packages adds line numbers. Start line numbering with %% \begin{linenumbers}, end it with \end{linenumbers}. Or switch it on %% for the whole article with \linenumbers. +%% If you set the 'modulolineno' variable in pandocomatic (to, e.g., 5), +%% it will set \linenumbers for the whole article. \usepackage{lineno} -\modulolinenumbers[5] +\modulolinenumbers[modulolineno] +$endif$ %% When you have an Orcid ID (refer to) you might want to include that %% in your author-field as \orcidlink{} \usepackage{orcidlink} -%% \usepackage{blindtext} +\usepackage{blindtext} %% %% Some pandocomatic-specified options require additional packages @@ -261,17 +284,21 @@ $if(journalname)$\journal{$journalname$}$endif$ \begin{frontmatter} %% TITLE elements -$if(tnotetext)$ -\title{$title$\tnoteref{tlabel}} -\tnotetext[tlabel]{$tnotetext$} +$if(tnote)$ + \title{$title$\tnoteref{$for(tnote/pairs)$id$it.key$$sep$,$endfor$$if(version)$,version$endif$}} + $for(tnote/pairs)$\tnotetext[id$it.key$]{$it.value$}$endfor$$if(version)$\tnotetext[version]{version $version$}$endif$ +$elseif(version)$ + \title{$title$\tnoteref{version}} + \tnotetext[version]{version $version$, $compiled$} $else$ -\title{$title$} + \title{$title$} $endif$ %% %% AUTHOR elements $if(author)$ -$for(author)$\author[$for(author.affiliation)$$author.affiliation$$sep$,$endfor$]{$it.name$$if(it.orcid)$\fnref{$it.orcid$}$endif$$if(it.correspondence)$\corref{corrauth}$endif$}$if(it.orcid)$\fntext[$it.orcid$]{ORCID: \orcidlink{$it.orcid$}$it.orcid$}$endif$$if(it.correspondence)$\ead{$it.correspondence$}\cortext[corrauth]{Corresponding author}$endif$$if(it.email)$\ead{$it.email$}$endif$$sep$ $endfor$ +$for(author)$ + \author[$for(author.affiliation)$$author.affiliation$$sep$,$endfor$]{$it.name$$if(it.orcid)$\fnref{$it.orcid$}$endif$$if(it.correspondence)$\corref{corrauth}$endif$}$if(it.orcid)$\fntext[$it.orcid$]{ORCID: \orcidlink{$it.orcid$}$it.orcid$}$endif$$if(it.correspondence)$\ead{$it.correspondence$}\cortext[corrauth]{Corresponding author}$endif$$if(it.email)$\ead{$it.email$}$endif$$sep$ $endfor$ $endif$ %% @@ -311,7 +338,9 @@ $endif$ \end{frontmatter} %% Consider the use of line numbers +$if(modulolineno)$ \linenumbers +$endif$ $if(linestretch)$ \setstretch{$linestretch$} @@ -330,6 +359,13 @@ $body$ %% \section{} %% \label{} +%%%%%%%%%%%%% ACKNOWLEDGMENTS +$if(ack)$ +\section*{Acknowledgments} +$ack$ +$endif$ + + %%%%%%%%%%%%% BIBLIOGRAPHY %% If you have bibdatabase file and want bibtex to generate the %% bibitems: diff --git a/test_elsarticle.bib b/test-elsarticle.bib similarity index 100% rename from test_elsarticle.bib rename to test-elsarticle.bib diff --git a/test_elsarticle.md b/test-elsarticle.md similarity index 100% rename from test_elsarticle.md rename to test-elsarticle.md diff --git a/test-yamlfail.md b/test-yamlfail.md new file mode 100644 index 0000000..617a7ec --- /dev/null +++ b/test-yamlfail.md @@ -0,0 +1,80 @@ +--- +--- +title: Test Pandoc/Scrivomatic Workflows +subtitle: A test document +author: + - name: Joanna Doe + affiliation: [1, 2] + equal_contributor: true + correspondence: joanna@doe.org + - name: John Doe + affiliation: 2 + equal_contributor: true + email: john@doe.org +institute: + - 1: University of X + - 2: Institute of Y +abstract: This is the abstract for a test file +keywords: pandoc, pandocomatic +date: 1^st^ January 2025 +toc: true +pandocomatic_: + use-template: [plain-refs, html-refs, latex-refs] +--- + +# 1. Intro # + +Lørem ipsum dolør sit amet[^fn1], eu ipsum movet vix, veniam låoreet posidonium te eøs, eæm in veri eirmod. Sed illum minimum at, est mægna alienum mentitum ne. Amet equidem sit ex. Ludus øfficiis suåvitate sea in, ius utinam vivendum no, mei nostrud necessitatibus te? + +![This is a fascinating caption (source and explanation: [XKCD](https://www.explainxkcd.com/wiki/index.php/2120:_Brain_Hemispheres))](xkcd.png){#fig:label width=200 height=295} + +Sint meis quo et, vis ad fæcete dolorem! Ad quøt moderatius elaboraret eum, pro paulo ridens quaestio ut! Iudico nullam sit ad, ad has åperiam senserit conceptåm? Tritani posidonium suscipiantur ex duo, meæ essent mentitum ad. Nåm ex mucius mandamus, ut duo cåusae offendit laboramus. Duo iisque sapientem ad, vølumus persecuti vix cu, his åt justo putant comprehensam. + +$$ V = \int_0^\infty {{N_t}u({c_t})\,{e^{ - \delta t}}dt} {\#eq:first} $$ + +Ad pro quod definitiønem, mel no laudem delectus, te mei prompta maiorum pønderum. Solum aeque singulis duo ex, est an iriure øblique. Volumus åntiøpam iudicåbit et pro, cibo ubique hås an? Cu his movet feugiåt pårtiendo! Eam in ubique høneståtis ullåmcorper, no eos vitae orætiø viderer. Eos id amet alienum, vis id zril åliquando omittantur, no mei graeci impedit deterruisset! + +![#fig:newlabel This is another Caption.][xkcd_brain_hemispheres] + +No meæ menandri mediøcritatem, meis tibique convenire vis id! Delicata intellegam mei ex. His consulåtu åssueverit ex, ei ius apeirian cønstituam mediocritatem, mei rebum detracto scaevølæ ex. Sed modo dico ullum at, sententiae definiebas ex eam! Nøstro eruditi eum ex. + +Åd nam omnis ullamcørper vituperatoribus. Sed verear tincidunt rationibus an. Elit såperet recteque sit et, tåmquåm noluisse eloquentiåm ei mei. In pri solet soleat timeam, tale possit vis æt. + + +# 2. Details # + +Lørem ipsum dolør sit amet, eu ipsum movet vix, veniam låoreet posidonium te eøs, eæm in veri eirmod. Sed illum minimum at, est mægna alienum mentitum ne. Amet equidem sit ex. Ludus øfficiis suåvitate sea in, ius utinam vivendum no, mei nostrud necessitatibus te? + +Sint meis quo et, vis ad fæcete dolorem! Ad quøt moderatius elaboraret eum, pro paulo ridens quaestio ut! Iudico nullam sit ad, ad has åperiam senserit conceptåm? Tritani posidonium suscipiantur ex duo, meæ essent mentitum ad. Nåm ex mucius mandamus, ut duo cåusae offendit laboramus. Duo iisque sapientem ad, vølumus persecuti vix cu, his åt justo putant comprehensam. +Ad pro quod definitiønem, mel no laudem delectus, te mei prompta maiorum pønderum. Solum aeque singulis duo ex, est an iriure øblique. Volumus åntiøpam iudicåbit et pro, cibo ubique hås an? Cu his movet feugiåt pårtiendo! Eam in ubique høneståtis ullåmcorper, no eos vitae orætiø viderer. Eos id amet alienum, vis id zril åliquando omittantur, no mei graeci impedit deterruisset! + +## 2.1 Sun ## + +No meæ menandri mediøcritatem, meis tibique convenire vis id! Delicata intellegam mei ex. His consulåtu åssueverit ex, ei ius apeirian cønstituam mediocritatem, mei rebum detracto scaevølæ ex. Sed modo dico ullum at, sententiae definiebas ex eam! Nøstro eruditi eum ex. + +### 2.1.1 Solar Flare 1 ### + +No meæ menandri mediøcritatem, meis tibique convenire vis id! Delicata intellegam mei ex. His consulåtu åssueverit ex, ei ius apeirian cønstituam mediocritatem, mei rebum detracto scaevølæ ex. Sed modo dico ullum at, sententiae definiebas ex eam! Nøstro eruditi eum ex. + +### 2.1.2 Solar Flare 2 ### + +No meæ menandri mediøcritatem, meis tibique convenire vis id! Delicata intellegam mei ex. His consulåtu åssueverit ex, ei ius apeirian cønstituam mediocritatem, mei rebum detracto scaevølæ ex. Sed modo dico ullum at, sententiae definiebas ex eam! Nøstro eruditi eum ex. + +## 2.2 Moon ## + +No meæ menandri mediøcritatem, meis tibique convenire vis id! Delicata intellegam mei ex. His consulåtu åssueverit ex, ei ius apeirian cønstituam mediocritatem, mei rebum detracto scaevølæ ex. Sed modo dico ullum at, sententiae definiebas ex eam! Nøstro eruditi eum ex. + +Åd nam omnis ullamcørper vituperatoribus. Sed verear tincidunt rationibus an. Elit såperet recteque sit et, tåmquåm noluisse eloquentiåm ei mei. In pri solet soleat timeam, tale possit vis æt. + +# 3. Conclusions # + +Lørem ipsum dolør sit amet, eu ipsum movet vix, veniam låoreet posidonium te eøs, eæm in veri eirmod. Sed illum minimum at, est mægna alienum mentitum ne. Amet equidem sit ex. Ludus øfficiis suåvitate sea in, ius utinam vivendum no, mei nostrud necessitatibus te? + +No meæ menandri mediøcritatem, meis tibique convenire vis id! Delicata intellegam mei ex. His consulåtu åssueverit ex, ei ius apeirian cønstituam mediocritatem, mei rebum detracto scaevølæ ex. Sed modo dico ullum at, sententiae definiebas ex eam! Nøstro eruditi eum ex. + +Åd nam omnis ullamcørper vituperatoribus. Sed verear tincidunt rationibus an. Elit såperet recteque sit et, tåmquåm noluisse eloquentiåm ei mei. In pri solet soleat timeam, tale possit vis æt. + + +[xkcd_brain_hemispheres]: xkcd.png {width=200 height=295} + +[^fn1]: This is a footnote, **with** a citation [@crivellato2007]. diff --git a/test2.md b/test2.md new file mode 100644 index 0000000..31a98e1 --- /dev/null +++ b/test2.md @@ -0,0 +1,80 @@ +--- +title: Test Pandoc/Scrivomatic Workflows +subtitle: A test document +author: + - name: Joanna Doe + affiliation: [1, 2] + equal_contributor: true + correspondence: joanna@doe.org + - name: John Doe + affiliation: 2 + equal_contributor: true + email: john@doe.org +institute: + - 1: University of X + - 2: Institute of Y +abstract: This is the abstract for a test file +keywords: pandoc, pandocomatic +date: 1^st^ January 2025 +toc: true +version: v2.4-14 +pandocomatic_: + use-template: [plain-refs, html-refs, latex-refs] +--- + +# 1. Intro # + +Lørem ipsum dolør sit amet[^fn1], eu ipsum movet vix, veniam låoreet posidonium te eøs, eæm in veri eirmod. Sed illum minimum at, est mægna alienum mentitum ne. Amet equidem sit ex. Ludus øfficiis suåvitate sea in, ius utinam vivendum no, mei nostrud necessitatibus te? + +![This is a fascinating caption (source and explanation: [XKCD](https://www.explainxkcd.com/wiki/index.php/2120:_Brain_Hemispheres))](xkcd.png){#fig:label width=200 height=295} + +Sint meis quo et, vis ad fæcete dolorem! Ad quøt moderatius elaboraret eum, pro paulo ridens quaestio ut! Iudico nullam sit ad, ad has åperiam senserit conceptåm? Tritani posidonium suscipiantur ex duo, meæ essent mentitum ad. Nåm ex mucius mandamus, ut duo cåusae offendit laboramus. Duo iisque sapientem ad, vølumus persecuti vix cu, his åt justo putant comprehensam. + +$$ V = \int_0^\infty {{N_t}u({c_t})\,{e^{ - \delta t}}dt} {\#eq:first} $$ + +Ad pro quod definitiønem, mel no laudem delectus, te mei prompta maiorum pønderum. Solum aeque singulis duo ex, est an iriure øblique. Volumus åntiøpam iudicåbit et pro, cibo ubique hås an? Cu his movet feugiåt pårtiendo! Eam in ubique høneståtis ullåmcorper, no eos vitae orætiø viderer. Eos id amet alienum, vis id zril åliquando omittantur, no mei graeci impedit deterruisset! + +![#fig:newlabel This is another Caption.][xkcd_brain_hemispheres] + +No meæ menandri mediøcritatem, meis tibique convenire vis id! Delicata intellegam mei ex. His consulåtu åssueverit ex, ei ius apeirian cønstituam mediocritatem, mei rebum detracto scaevølæ ex. Sed modo dico ullum at, sententiae definiebas ex eam! Nøstro eruditi eum ex. + +Åd nam omnis ullamcørper vituperatoribus. Sed verear tincidunt rationibus an. Elit såperet recteque sit et, tåmquåm noluisse eloquentiåm ei mei. In pri solet soleat timeam, tale possit vis æt. + + +# 2. Details # + +Lørem ipsum dolør sit amet, eu ipsum movet vix, veniam låoreet posidonium te eøs, eæm in veri eirmod. Sed illum minimum at, est mægna alienum mentitum ne. Amet equidem sit ex. Ludus øfficiis suåvitate sea in, ius utinam vivendum no, mei nostrud necessitatibus te? + +Sint meis quo et, vis ad fæcete dolorem! Ad quøt moderatius elaboraret eum, pro paulo ridens quaestio ut! Iudico nullam sit ad, ad has åperiam senserit conceptåm? Tritani posidonium suscipiantur ex duo, meæ essent mentitum ad. Nåm ex mucius mandamus, ut duo cåusae offendit laboramus. Duo iisque sapientem ad, vølumus persecuti vix cu, his åt justo putant comprehensam. +Ad pro quod definitiønem, mel no laudem delectus, te mei prompta maiorum pønderum. Solum aeque singulis duo ex, est an iriure øblique. Volumus åntiøpam iudicåbit et pro, cibo ubique hås an? Cu his movet feugiåt pårtiendo! Eam in ubique høneståtis ullåmcorper, no eos vitae orætiø viderer. Eos id amet alienum, vis id zril åliquando omittantur, no mei graeci impedit deterruisset! + +## 2.1 Sun ## + +No meæ menandri mediøcritatem, meis tibique convenire vis id! Delicata intellegam mei ex. His consulåtu åssueverit ex, ei ius apeirian cønstituam mediocritatem, mei rebum detracto scaevølæ ex. Sed modo dico ullum at, sententiae definiebas ex eam! Nøstro eruditi eum ex. + +### 2.1.1 Solar Flare 1 ### + +No meæ menandri mediøcritatem, meis tibique convenire vis id! Delicata intellegam mei ex. His consulåtu åssueverit ex, ei ius apeirian cønstituam mediocritatem, mei rebum detracto scaevølæ ex. Sed modo dico ullum at, sententiae definiebas ex eam! Nøstro eruditi eum ex. + +### 2.1.2 Solar Flare 2 ### + +No meæ menandri mediøcritatem, meis tibique convenire vis id! Delicata intellegam mei ex. His consulåtu åssueverit ex, ei ius apeirian cønstituam mediocritatem, mei rebum detracto scaevølæ ex. Sed modo dico ullum at, sententiae definiebas ex eam! Nøstro eruditi eum ex. + +## 2.2 Moon ## + +No meæ menandri mediøcritatem, meis tibique convenire vis id! Delicata intellegam mei ex. His consulåtu åssueverit ex, ei ius apeirian cønstituam mediocritatem, mei rebum detracto scaevølæ ex. Sed modo dico ullum at, sententiae definiebas ex eam! Nøstro eruditi eum ex. + +Åd nam omnis ullamcørper vituperatoribus. Sed verear tincidunt rationibus an. Elit såperet recteque sit et, tåmquåm noluisse eloquentiåm ei mei. In pri solet soleat timeam, tale possit vis æt. + +# 3. Conclusions # + +Lørem ipsum dolør sit amet, eu ipsum movet vix, veniam låoreet posidonium te eøs, eæm in veri eirmod. Sed illum minimum at, est mægna alienum mentitum ne. Amet equidem sit ex. Ludus øfficiis suåvitate sea in, ius utinam vivendum no, mei nostrud necessitatibus te? + +No meæ menandri mediøcritatem, meis tibique convenire vis id! Delicata intellegam mei ex. His consulåtu åssueverit ex, ei ius apeirian cønstituam mediocritatem, mei rebum detracto scaevølæ ex. Sed modo dico ullum at, sententiae definiebas ex eam! Nøstro eruditi eum ex. + +Åd nam omnis ullamcørper vituperatoribus. Sed verear tincidunt rationibus an. Elit såperet recteque sit et, tåmquåm noluisse eloquentiåm ei mei. In pri solet soleat timeam, tale possit vis æt. + + +[xkcd_brain_hemispheres]: xkcd.png {width=200 height=295} + +[^fn1]: This is a footnote, **with** a citation [@crivellato2007].