Skip to content
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

bids spec pdf version #430

Closed
wants to merge 9 commits into from
Closed
Show file tree
Hide file tree
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
17 changes: 17 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,22 @@ jobs:
root: .
paths: site

build_docs_pdf:
working_directory: ~/bids-specification/pdf_build_src
docker:
- image: danteev/texlive:TL2017
steps:
- checkout:
path: ~/bids-specification
- run:
name: generate pdf version docs
command: sh build_pdf.sh
- store_artifacts:
path: bids-spec.pdf
- run:
name: remove pdf version from repo
command: rm bids-spec.pdf

linkchecker:
docker:
- image: yarikoptic/linkchecker:9.4.0.anchorfix1-1
Expand Down Expand Up @@ -144,6 +160,7 @@ workflows:
search_build:
jobs:
- build_docs
- build_docs_pdf
- linkchecker:
requires:
- build_docs
Expand Down
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
site/
site/
.DS_Store
src/.DS_Store
src/04-modality-specific-files/.DS_Store
node_modules/
package-lock.json
43 changes: 43 additions & 0 deletions pandoc-script.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# make a copy of src directory
rm -rf copy_src
rm bids-specs.pdf
mkdir copy_src
cp -a ./src/* ./copy_src
cd copy_src
pwd

# rename files within the copy_src directory
for j in *.md; do
if [ ${j:0:1} -eq '0' ]; then
mv "$j" "${j//${j:1:1}/${j:1:1}0}"
fi
done

# renaming and copying files in the 04-modality-specific-files directory
cd ./04-modality-specific-files
# pwd
cp -a ./images/* ../images;

for i in ./*.md; do
mv "$i" "${i//[0]/04}"
done

cp -a ./*.md ..;

# doing same as above for the appendices directory
cd ../99-appendices
# pwd

# renaming files in the appendices directory
for k in ./*.md; do
mv "$k" "${k//[0]/99}"
done

cp -a ./*.md ..;
cd ..
pandoc index.md *.md -f markdown_github --include-before-body cover.tex --toc --listings -H listings_setup.tex -H header.tex --include-in-header chapter_break.tex -V toc-title='Table of Contents' -V linkcolor:blue -V geometry:a4paper -V geometry:margin=2cm --pdf-engine=xelatex -o bids-specs.pdf

cp bids-specs.pdf ..
cd ..
rm -rf copy_src
open bids-specs.pdf
41 changes: 41 additions & 0 deletions pdf_build_src/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# pdf-version of BIDS specification

The `pdf_build_src` directory contains the scripts and tex files required to build a pdf document of the BIDS specification from multiple markdown files using the pandoc library.

Pandoc is command line tool which is also a Haskell library that converts files from one markup format to another. More here: https://pandoc.org/index.html

## Requirements

For the pdf build to be successful, the following need to be installed:

- Python 3.x
- pandoc
- Latest version of LaTeX: By default, Pandoc creates PDFs using LaTeX. Because a full MacTeX installation uses four gigabytes of disk space, pandoc recommends BasicTeX or TinyTeX and using the tlmgr tool to install additional packages as needed.

Installation instructions for both pandoc and LaTeX: https://pandoc.org/installing.html

## Building pdf document

Run the `build_pdf.sh` from the `pdf_build_src` with the command `sh build_pdf.sh` from the command line terminal

List of warnings are for missing characters like emojis while converting from markdown to pdf. Except for losing those characters in the final document, it doesn't affect the formatting or contents and therefore, can be ignored.

## Technical Overview

Pandoc comes with a plethora of options to format the resulting document. For building a pdf from multiple markdowns, a consolidated intermediate tex file is first built, which is then converted to a pdf document. To achieve the desired formatting in the final pdf, additional tex files are used with options offered by pandoc.

### Formatting files

`listings_setup.tex` - Listings is a LaTeX package used for typestting programming code in TeX. This file sets up the listings package to suit our needs and is used with the `--listings` option.

`cover.tex` - BIDS Logo is used as a cover page for the document. `cover.tex` is used with the option `--include-before-body`

`header.tex` - Header tex file that's updated with the latest version number and date when `build_pdf.sh` is run. Used with the `-H` header option.

### Scripts

`process_markdowns.py` - Script that processes markdown files in the `src` directory that are duplicated and modified for the needs of the pdf.

`pandoc_script.py` - Prepares and runs the final pandoc command through the `build_pdf.sh` script

`build_pdf.sh` - Shell script that organizes the directory structure and runs the above two python scripts
16 changes: 16 additions & 0 deletions pdf_build_src/build_pdf.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Shell script that runs process_markdowns.py and pandoc_script.py in sequence to build the pdf document

# prepare the copied src directory
python3 process_markdowns.py

# copy pandoc_script into the temp src_copy directory
cp pandoc_script.py header.tex cover.tex listings_setup.tex src_copy/src

# run pandoc_script from src_copy directory
cd src_copy/src
python3 pandoc_script.py
mv bids-spec.pdf ../..
cd ../..

# delete the duplicated src directory
rm -rf src_copy
27 changes: 27 additions & 0 deletions pdf_build_src/cover.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
% adds the bids logo as the cover page of the pdf
\begin{titlepage}

\newcommand{\HRule}{\rule{\linewidth}{0.5mm}} % Defines a new command for the horizontal lines, change thickness here

\center % Center everything on the page



%----------------------------------------------------------------------------------------
% LOGO SECTION
%----------------------------------------------------------------------------------------

\includegraphics[width=0.6\textwidth]{images/BIDS_logo.jpg}\\[1cm]

%----------------------------------------------------------------------------------------
% TITLE SECTION
%----------------------------------------------------------------------------------------

\HRule \\[0.4cm]
{ \huge \bfseries Brain Imaging Data Structure Specification}\\[0.4cm] % Title of your document
\HRule \\[1.5cm]

% \textsc{\large v1.2.1}\\[0.5cm]{\large 2019-08-14}\\[2cm]

% \vfill % Fill the rest of the page with whitespace
\textsc{\large v1.2.1}\\[0.5cm]{\large 2019-08-14}\\[2cm]\vfill\end{titlepage}
6 changes: 6 additions & 0 deletions pdf_build_src/header.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
% header file
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\chead{Brain Imaging Data Structure v1.2.1 2019-08-14}
\fancyfoot[LE,RO]{\thepage}
25 changes: 25 additions & 0 deletions pdf_build_src/listings_setup.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
% Contents of listings-setup.tex
\usepackage{xcolor}
\usepackage{graphicx}

\lstset{
basicstyle=\ttfamily,
numbers=left,
keywordstyle=\color[rgb]{0.13,0.29,0.53}\bfseries,
stringstyle=\color[rgb]{0.31,0.60,0.02},
commentstyle=\color[rgb]{0.56,0.35,0.01}\itshape,
numberstyle=\footnotesize,
stepnumber=1,
numbersep=5pt,
backgroundcolor=\color[RGB]{248,248,248},
showspaces=false,
showstringspaces=false,
showtabs=false,
tabsize=2,
captionpos=b,
breaklines=true,
breakautoindent=true,
escapeinside={\%*}{*)},
linewidth=\textwidth,
basewidth=0.5em
}
43 changes: 43 additions & 0 deletions pdf_build_src/pandoc_script.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
"""Use the pandoc library as a final step to build the pdf.

This is done once the duplicate src directory is processed.
"""
import os
import subprocess


def build_pdf(filename):
"""Construct command with required pandoc flags and run using subprocess.

Parameters
----------
filename : str
Name of the output file.

"""
markdown_list = []
for root, dirs, files in os.walk('.'):
for file in files:
if file.endswith(".md") and file != 'index.md':
markdown_list.append(os.path.join(root, file))
elif file == 'index.md':
index_page = os.path.join(root, file)

default_pandoc_cmd = "pandoc "

# creates string of file paths in the order we'd like them to be appear
# ordering is taken care of by the inherent file naming
files_string = index_page + " " + " ".join(sorted(markdown_list))

flags = (" -f markdown_github --include-before-body cover.tex --toc "
"-V documentclass=report --listings -H listings_setup.tex "
"-H header.tex -V linkcolor:blue -V geometry:a4paper "
"-V geometry:margin=2cm --pdf-engine=xelatex -o ")
output_filename = filename

cmd = default_pandoc_cmd + files_string + flags + output_filename
subprocess.run(cmd.split())


if __name__ == "__main__":
build_pdf('bids-spec.pdf')
Loading