diff options
author | Suren A. Chilingaryan <csa@suren.me> | 2021-03-07 06:05:59 +0100 |
---|---|---|
committer | Suren A. Chilingaryan <csa@suren.me> | 2021-03-07 06:05:59 +0100 |
commit | 9318cf9302ecefccd7cff8461439c965b1e1edc8 (patch) | |
tree | 3743b960df6e75c920171592d1ed0a6339f9dac4 | |
parent | 617192d5107af675fdf27462e21f60c8459b2c5e (diff) | |
download | cv-9318cf9302ecefccd7cff8461439c965b1e1edc8.tar.gz cv-9318cf9302ecefccd7cff8461439c965b1e1edc8.tar.bz2 cv-9318cf9302ecefccd7cff8461439c965b1e1edc8.tar.xz cv-9318cf9302ecefccd7cff8461439c965b1e1edc8.zip |
First draft of scientific CV
-rwxr-xr-x | .gitignore | 12 | ||||
-rw-r--r-- | .gitmodules | 3 | ||||
-rw-r--r-- | Makefile | 3898 | ||||
m--------- | bib | 0 | ||||
-rw-r--r-- | cv.tex | 76 | ||||
-rw-r--r-- | section_academic.tex | 15 | ||||
-rw-r--r-- | section_competences.tex | 10 | ||||
-rw-r--r-- | section_education.tex | 6 | ||||
-rw-r--r-- | section_employment.tex | 11 | ||||
-rw-r--r-- | section_experiments.tex | 30 | ||||
-rw-r--r-- | section_funding.tex | 33 | ||||
-rw-r--r-- | section_leadership.tex | 16 | ||||
-rw-r--r-- | section_presentations.tex | 61 | ||||
-rw-r--r-- | section_research.tex | 61 | ||||
-rw-r--r-- | section_responsibilities.tex | 31 | ||||
-rw-r--r-- | section_skills.tex | 11 | ||||
-rw-r--r-- | section_software.tex | 39 | ||||
-rw-r--r-- | section_supervision.tex | 20 | ||||
-rw-r--r-- | xetex-inputenc.sty | 83 | ||||
l---------[-rwxr-xr-x] | yaac-another-awesome-cv.cls | 542 | ||||
-rwxr-xr-x | yaac-another-awesome-cv/LICENSE (renamed from LICENSE) | 0 | ||||
-rw-r--r-- | yaac-another-awesome-cv/PULL_REQUEST_TEMPLATE.md (renamed from PULL_REQUEST_TEMPLATE.md) | 0 | ||||
-rwxr-xr-x | yaac-another-awesome-cv/README.md (renamed from README.md) | 0 | ||||
-rw-r--r-- | yaac-another-awesome-cv/example/cr.png (renamed from example/cr.png) | bin | 1189993 -> 1189993 bytes | |||
-rw-r--r-- | yaac-another-awesome-cv/example/cv.bcf (renamed from example/cv.bcf) | 0 | ||||
-rw-r--r-- | yaac-another-awesome-cv/example/cv.run.xml (renamed from example/cv.run.xml) | 0 | ||||
-rwxr-xr-x | yaac-another-awesome-cv/example/cv.tex (renamed from example/cv.tex) | 0 | ||||
-rw-r--r-- | yaac-another-awesome-cv/example/darwiin.png (renamed from example/darwiin.png) | bin | 12121 -> 12121 bytes | |||
l--------- | yaac-another-awesome-cv/example/fonts (renamed from example/fonts) | 0 | ||||
-rw-r--r-- | yaac-another-awesome-cv/example/preview/cv1-alternative.jpeg (renamed from example/preview/cv1-alternative.jpeg) | bin | 249336 -> 249336 bytes | |||
-rw-r--r-- | yaac-another-awesome-cv/example/preview/cv1.jpeg (renamed from example/preview/cv1.jpeg) | bin | 234285 -> 234285 bytes | |||
-rw-r--r-- | yaac-another-awesome-cv/example/preview/cv2-alternative.jpeg (renamed from example/preview/cv2-alternative.jpeg) | bin | 216611 -> 216611 bytes | |||
-rw-r--r-- | yaac-another-awesome-cv/example/preview/cv2.jpeg (renamed from example/preview/cv2.jpeg) | bin | 210256 -> 210256 bytes | |||
-rw-r--r-- | yaac-another-awesome-cv/example/sample.bib (renamed from example/sample.bib) | 0 | ||||
-rwxr-xr-x | yaac-another-awesome-cv/example/section_competences.tex (renamed from example/section_competences.tex) | 0 | ||||
-rwxr-xr-x | yaac-another-awesome-cv/example/section_experience.tex (renamed from example/section_experience.tex) | 0 | ||||
-rwxr-xr-x | yaac-another-awesome-cv/example/section_experience_short.tex (renamed from example/section_experience_short.tex) | 0 | ||||
-rwxr-xr-x | yaac-another-awesome-cv/example/section_headline.tex (renamed from example/section_headline.tex) | 0 | ||||
-rw-r--r-- | yaac-another-awesome-cv/example/section_headline_archi.tex (renamed from example/section_headline_archi.tex) | 0 | ||||
-rwxr-xr-x | yaac-another-awesome-cv/example/section_interets.tex (renamed from example/section_interets.tex) | 0 | ||||
-rwxr-xr-x | yaac-another-awesome-cv/example/section_langues.tex (renamed from example/section_langues.tex) | 0 | ||||
-rw-r--r-- | yaac-another-awesome-cv/example/section_projets.tex (renamed from example/section_projets.tex) | 0 | ||||
-rwxr-xr-x | yaac-another-awesome-cv/example/section_references.tex (renamed from example/section_references.tex) | 0 | ||||
-rwxr-xr-x | yaac-another-awesome-cv/example/section_scolarite.tex (renamed from example/section_scolarite.tex) | 0 | ||||
l--------- | yaac-another-awesome-cv/example/yaac-another-awesome-cv.cls (renamed from example/yaac-another-awesome-cv.cls) | 0 | ||||
-rwxr-xr-x | yaac-another-awesome-cv/fonts/SourceSansPro-Black.otf (renamed from fonts/SourceSansPro-Black.otf) | bin | 234176 -> 234176 bytes | |||
-rwxr-xr-x | yaac-another-awesome-cv/fonts/SourceSansPro-BlackIt.otf (renamed from fonts/SourceSansPro-BlackIt.otf) | bin | 81120 -> 81120 bytes | |||
-rwxr-xr-x | yaac-another-awesome-cv/fonts/SourceSansPro-Bold.otf (renamed from fonts/SourceSansPro-Bold.otf) | bin | 235128 -> 235128 bytes | |||
-rwxr-xr-x | yaac-another-awesome-cv/fonts/SourceSansPro-BoldIt.otf (renamed from fonts/SourceSansPro-BoldIt.otf) | bin | 80392 -> 80392 bytes | |||
-rwxr-xr-x | yaac-another-awesome-cv/fonts/SourceSansPro-ExtraLight.otf (renamed from fonts/SourceSansPro-ExtraLight.otf) | bin | 221580 -> 221580 bytes | |||
-rwxr-xr-x | yaac-another-awesome-cv/fonts/SourceSansPro-ExtraLightIt.otf (renamed from fonts/SourceSansPro-ExtraLightIt.otf) | bin | 76400 -> 76400 bytes | |||
-rwxr-xr-x | yaac-another-awesome-cv/fonts/SourceSansPro-It.otf (renamed from fonts/SourceSansPro-It.otf) | bin | 79724 -> 79724 bytes | |||
-rwxr-xr-x | yaac-another-awesome-cv/fonts/SourceSansPro-Light.otf (renamed from fonts/SourceSansPro-Light.otf) | bin | 226032 -> 226032 bytes | |||
-rwxr-xr-x | yaac-another-awesome-cv/fonts/SourceSansPro-LightIt.otf (renamed from fonts/SourceSansPro-LightIt.otf) | bin | 77816 -> 77816 bytes | |||
-rwxr-xr-x | yaac-another-awesome-cv/fonts/SourceSansPro-Regular.otf (renamed from fonts/SourceSansPro-Regular.otf) | bin | 229588 -> 229588 bytes | |||
-rwxr-xr-x | yaac-another-awesome-cv/fonts/SourceSansPro-Semibold.otf (renamed from fonts/SourceSansPro-Semibold.otf) | bin | 232680 -> 232680 bytes | |||
-rwxr-xr-x | yaac-another-awesome-cv/fonts/SourceSansPro-SemiboldIt.otf (renamed from fonts/SourceSansPro-SemiboldIt.otf) | bin | 80316 -> 80316 bytes | |||
-rw-r--r-- | yaac-another-awesome-cv/yaac-another-awesome-cv.cls | 864 |
58 files changed, 5277 insertions, 545 deletions
@@ -1,3 +1,7 @@ +*.make +*.temp +*.d +*.bcf *.acn *.acr *.alg @@ -30,10 +34,10 @@ *.vrb *.xdy *.tdo -*.pdf -cv.fls -cv.texnicle -cv.texnicle.backup +cv*.run.xml +cv*.fls +cv*.texnicle +cv*.texnicle.backup .DS_Store latex-classicalcv.sublime-project latex-classicalcv.sublime-workspace diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..add994e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "bib"] + path = bib + url = ssh://darksoft.org/repo/git/csa/papers/bib.git diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3a5afcf --- /dev/null +++ b/Makefile @@ -0,0 +1,3898 @@ +# Copyright 2004 Chris Monson (shiblon@gmail.com) +# Latest version available at http://www.bouncingchairs.net/oss +# +# This file is part of ``Chris Monson's Free Software''. +# +# ``Chris Monson's Free Software'' 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, Version 2. +# +# ``Chris Monson's Free Software'' 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. +# +# You should have received a copy of the GNU General Public License along +# with ``Chris Monson's Free Software''; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# It is also available on the web at http://www.gnu.org/copyleft/gpl.html +# +# Note that using this makefile to build your documents does NOT place them +# under the GPL unless you, the author, specifically do so. In other words, +# I, Chris Monson, the copyright holder and author of this makefile, +# consider it impossible to ``link'' to this makefile in any way covered by +# the GPL. +# +# +# TO OBTAIN INSTRUCTIONS FOR USING THIS FILE, RUN: +# make help +# +fileinfo := LaTeX Makefile +author := Chris Monson +version := 2.2.0 +# +.DEFAULT_GOAL := all +# Note that the user-global version is imported *after* the source directory, +# so that you can use stuff like ?= to get proper override behavior. +.PHONY: Makefile GNUmakefile Makefile.ini $(HOME)/.latex-makefile/Makefile.ini +-include Makefile.ini +-include $(HOME)/.latex-makefile/Makefile.ini +# Better names for these things +.PHONY: Variables.ini $(HOME)/.latex-makefile/Variables.ini +-include Variables.ini +-include $(HOME)/.latex-makefile/Variables.ini +# +# This can be pdflatex or latex - you can change this by adding the following line to your Makefile.ini: +# BUILD_STRATEGY := latex +#BUILD_STRATEGY ?= pdflatex +BUILD_STRATEGY ?= xelatex +# +# Sets LC_ALL=C, by default, so that the locale-aware tools, like sort, be +# # immune to changes to the locale in the user environment. +export LC_ALL ?= C +# +# +# If you specify sources here, all other files with the same suffix +# will be treated as if they were _include_ files. +#onlysources.tex ?= paper.tex transact.tex +onlysources.tex ?= cv.tex +#onlysources.tex ?= transact.tex +#onlysources.tex ?= paper-diff.tex +#onlysources.tex ?= transact-diff.tex + +#onlysources.tex.sh ?= +#onlysources.tex.pl ?= +#onlysources.tex.py ?= +#onlysources.rst ?= +#onlysources.fig ?= +#onlysources.gpi ?= +#onlysources.dot ?= +#onlysources.xvg ?= +#onlysources.svg ?= +#onlysources.eps.gz ?= +#onlysources.eps ?= +# +# If you list files here, they will be treated as _include_ files +#includes.tex ?= file1.tex file2.tex +#includes.tex.sh ?= +#includes.tex.pl ?= +#includes.tex.py ?= +#includes.rst ?= +#includes.fig ?= +#includes.gpi ?= +#includes.dot ?= +#includes.xvg ?= +#includes.svg ?= +#includes.eps.gz ?= +#includes.eps ?= +# +# If you list files or wildcards here, they will *not* be cleaned - default is +# to allow everything to be cleaned. +#neverclean ?= *.pdf +# +# Alternatively (recommended), you can add those lines to a Makefile.ini file +# and it will get picked up automatically without your having to edit this +# Makefile. +# +# KNOWN ISSUES: +# * The following occurs: +# file with: \usepackage{named}\bibliographystyle{named} +# Compile +# change to: \usepackage{apalike}\bibliographystyle{apalike} +# Compile again -- BARF! +# +# The workaround: make clean-nographics; make +# +# Note that we may not be able to fix this. LaTeX itself barfs +# on this, not the makefile. The very first invocation of LaTeX +# (when something like this has happened) reads the existing .aux +# file and discovers invalid commands like \citeauthoryear that +# are only valid in the package that was just removed. It then +# tries to parse them and explodes. It's not at all clear to me +# how to fix this. I tried removing the .aux files on the first +# run of LaTeX, but that necessarily requires more subsequent +# rebuilds on common edits. There does not appear to be a +# graceful solution to this issue. +# +# +# CHANGES: +# Chris Monson (2011-05-20): +# * Bumped version to 2.2.0 (release!) +# Chris Monson (2011-05-19): +# * Bumped version to 2.2.0-rc15 +# * Issue 125: infinite recursion with nomenclature files +# * Issue 125: removed .d as a target for .nls in get-log-index +# * Cleaned up invocation of run-makeindex to take an optional .ist instead of flags. +# Chris Monson (2011-04-06): +# * Bumped version to 2.2.0-rc14 +# * Issue 121: Added Targets.ini and corresponding help text for it. +# * Issue 121: Added Variables.ini (Makefile.ini still works, though). +# * Issue 121: Added .DEFAULT_GOAL optional setting. +# * Issue 120: xindy compatibility +# Chris Monson (2011-03-16): +# * Bumped version to 2.2.0-rc13 +# * Fixed a bug in kspewhich invocation - random characters and a missing pipe. +# * Added font embedding to gnuplot output. +# Chris Monson (2011-03-15): +# * Bumped version to 2.2.0-rc12 +# * Issue 119: Annoying warning from which if Gnuplot not installed. +# * Fixed catchall error output to show more info from the log. Cutting off the +# first line is too jarring. +# * Issue 118: Better glossary support +# Chris Monson (2011-03-03): +# * Bumped version to 2.2.0-rc11 +# * Issue 112: Fixed regression introduced by use of cygpath (ugly warnings) +# Chris Monson (2011-02-03): +# * Bumped version to 2.2.0-rc10 +# * Issue 112: Added path normalization for cygwin systems +# * Fixed a bug in get-missing-inputs where we weren't specifying target files +# Chris Monson (2011-01-24): +# * Issue 111: Added .jpeg as a possible image extension +# Chris Monson (2011-01-21): +# * Issue 110: Long filenames not produced correctly in .d file +# * Fixed problem with unknown control sequence error parsing +# * Fixed problem with \r in fatal output (was interpreted as LF by echo) +# * Removed a spurious "hi" +# Chris Monson (2011-01-14): +# * Bumped version to 2.2.0-rc8 +# * Issue 107: Removed comment with embedded newline, fixing MinGW on Windows 7. +# Chris Monson (2011-01-07): +# * Emit an error if .gpi.d files have dependencies with : in the name +# Chris Monson (2011-01-05): +# * Bumped version to 2.2.0-rc7 +# * Issue 106: existing graphic dependencies not generated correctly +# Chris Monson (2011-01-04): +# * Issue 106: not cleaning eps log files properly +# * Issue 106: not rebuilding after creating .pdf graphics from .eps +# * Issue 94: svg going unnecessarily through eps (can't reproduce) +# Chris Monson (2010-12-31): +# * Issue 100: make hanging because of faulty graphics detection (sed bug) +# * Issue 108: do not ignore fatal errors from pdftex +# Chris Monson (2010-12-23): +# * Added gpi_global to gnuplot dependencies so that changes are detected +# Chris Monson (2010-12-20): +# * Updated build file to be smarter about Python version detection +# * Created a bunch of test files and supporting scripts +# * Issue 72: added apacite capaability (thanks to matkarat) +# Chris Monson (2010-11-23): +# * Changed to multi-part makefile build (split out sed scripts) +# * Added build script and supporting infrastructure +# * Updated test directory format +# * Added notes about needed test cases +# * Changed to use -file-line-error and fixed multiple inclusion/error bugs +# * Added run_sed.py to allow easy testing of sed scripts outside of make +# Chris Monson (2010-11-11): +# * Bumped version to 2.2.0-rc7 +# * issue 92: broken hyperref driver detection fixed +# * issue 101: Broken inkscape conversion +# * issue 102: Broken specification of font size for gnuplot pdfcairo +# * Added KEEP_TEMP so that we can avoid deleting useful temporaries for debugging +# * Restructured gnuplot code to be easier to follow +# * Fixed a bug in convert-gpi where we were using $< instead of $1 +# Chris Monson (2010-11-03): +# * Bumped version to 2.2.0-rc6 +# * issue 96: Fix sed errors when using make variables in substitutions +# Chris Monson (2010-07-28): +# * Bumped version to 2.2.0-rc5 (rc4 is broken) +# * Bail out when we find the use of the import.sty package +# * Issue 90: Add -z to dvips invocation +# * Issue 67: Add xelatex support (thanks to Nikolai Prokoschenko for the patch!) +# * Issue 85: Add warning about make 3.80 +# Chris Monson (2010-06-20): +# * Bumped version to 2.2.0-rc3 +# * Attempt to fix bug with ! error detection (issue 88) +# * Added svg->pdf direct support (issue 89) +# Chris Monson (2010-04-28): +# * Bumped version to 2.2.0-rc2 +# * Fixed %._show target +# Chris Monson (2010-04-08): +# * Bumped version to 2.2.0-rc1 +# * Added back in the rst_style_file stuff that got broken when switching +# rst -> tex to use the script mechanism +# Chris Monson (2010-03-23): +# * Bumped version to 2.2.0-beta8 +# * Work on issue 76: bad backtick escape for some sed versions, failure +# to clear out the hold buffer when outputting MISSING comment. +# - Backed out 2>&1 to &> (doesn't work in sh) +# - Backed out using . to source variables +# Chris Monson (2010-03-22): +# * Bumped version to 2.2.0-beta7 +# * Issue 72: Fix latex/bibtex invocation order for annotated bib styles +# * Fixed informational output to reflect which LaTeX run we're on +# * Fixed graphic detection to include graphics that are already there in +# .d files +# * Tightened up the .d file output to only make .d depend on graphic +# *source* files. This means that building foo.d no longer +# builds all of the graphics files on which foo.tex depends. +# Had to use .SECONDEXPANSION trickery to make it work. +# * Changed get-graphics to only accept a stem. +# * Fixed build-once logic for scripted .tex to work better +# * Made get-inputs sed script more maintainable. +# * Moved Makefile.ini import up higher. +# * Changed bare stems to not recursively invoke make +# * Updated diff output to be more silent everywhere +# * Added a MISSING comment to the .d file if stuff isn't found - forces +# removal of .1st.make file, which often forces it to try again. +# * Fixed broken graphics-target function +# * Added sleep to .d file generation when stuff is missing - if it +# builds too fast, make doesn't realize it needs to be reloaded, +# and thus never discovers some deeper dependencies (especially +# evident when graphics are included from scripted include +# files). +# Chris Monson (2010-03-17): +# * Bumped version to 2.2.0-beta6 +# * Fixed bareword builds to actually work (requires static patterns) +# * Fixed colorization to work with new paragraph stuff +# Chris Monson (2010-03-17): +# * Bumped version to 2.2.0-beta5 +# * Fixed graphic detection to be much more focused - splits log file +# into paragraphs before doing pattern matching. +# * Fixed make foo to work properly (recursively calls make foo.pdf) +# * Fixed gpi -> pdf generation to not waste time building .eps *after* +# the pdf already exists. +# * Changed log copies to include MAKE_RESTARTS as part of the name. +# * Fixed missing include file detection (also makes use of the paragraph +# stuff) to detect missing scripted include files. +# Chris Monson (2010-03-16): +# * Bumped version to 2.2.0-beta4 +# * issue 70: .pdf not moved out of the way properly on first +# compilation, resulting in early error detection failure. +# * issue 74: fixed broken error on missing .aux files: the +# implementation was masking real errors. +# Chris Monson (2010-03-15): +# * Bumped version to 2.2.0-beta3 +# * issue 71: Made the tput dependency optional +# * issue 73: Made .tex targets not pull in .d files (building them from +# scripts should not require a .d) +# * issue 74: Output a much saner error when a .aux file is not produced +# (e.g., when you are typing "make" without arguments in a +# directory with included .tex files that are not named with +# ._include_.) +# Chris Monson (2010-03-11): +# * Bumped version to 2.2.0-beta2 +# * Fixed clean-graphics to get rid of intermediate .eps files that may +# be hanging around +# * Added an automatic setting to use eps terminals in pdflatex mode for +# gnuplot if it doesn't understand pdf. +# * issue 66: Removed grayscale generation via magic suffix. Grayscale +# generation is now only available via GRAY=1 +# * issue 68: Added explicit handling of LC_ALL for locale-aware tools +# like "sort" +# Chris Monson (2010-03-10): +# * Bumped version to 2.2.0-beta1 +# * Fixed success message to handle output message in different places +# * Added name of produced file to success message +# Chris Monson (2010-03-10): +# * Bumped version to 2.2.0-alpha3 +# * Added meaningful error message for wrong hyperref options +# * Added meaningful error message for incorrect graphics extensions +# Chris Monson (2010-03-09): +# * Bumped version to 2.2.0-alpha2 +# * Updated graphics handling (gnuplot and fig generate pdf natively) +# * Changed xmgrace to output monochrome natively +# Chris Monson (2010-03-09): +# * Bumped version to 2.2.0-alpha1 - major change! +# * Support pdflatex natively and by default (issue 6 - a long time coming) +# * Add ability to have a single $HOME/.latex-makefile/Makefile.ini for +# all invocations +# * Reworked graphic inclusion detection so that extensions need not be +# specified for either build strategy (e.g., +# \includegraphics{test1.eps} -> \includegrahpics{test1}) +# * Changed log format to include filenames and line numbers +# Chris Monson (2010-02-04): +# * Bumped version to 2.1.43 +# * All of the following are for issue 63 (thanks to mojoh81): +# * Added documentation about fixing Makefile.ini default target +# * Added perl and python script targets +# * Fixed run logic to allow included .tex files to be scripted (the +# run-again logic now detects missing .tex files, and the MV +# command has been switched out for a command that only invokes +# MV if the files exist) +# * Changed scripted generation to only run once per make invocation +# * Added dependency on expr +# Chris Monson (2010-01-19): +# * Bumped version to 2.1.42 +# * issue 62: Added .brf extension to cleanable files (backrefs) +# Chris Monson (2010-01-07): +# * Bumped version to 2.1.41 +# * issue 60: bad makeindex runs now error out on subsequent tries +# Chris Monson (2009-12-01): +# * Bumped version to 2.1.40 +# * issue 36: build all indices (for e.g., splitidx usage) +# * issue 59: clean up all generated files (including indices) +# Chris Monson (2009-11-23): +# * Bumped version to 2.1.39 +# * issue 57: change ps2pdf invocations to just use gs directly +# Chris Monson (2009-11-19): +# * Bumped version to 2.1.38 +# * issue 57: Added some limited support for Cygwin (spaces in filenames) +# Chris Monson (2009-11-15): +# * Bumped version to 2.1.37 +# * Removed svninfo, since this is now managed by mercurial +# * Fixed typo in changelist +# * Issue 52: added jpg->eps conversion (thanks to brubakee) +# * Issue 54: fix missing Overfull colorization due to lack of a blank +# line preceding the first error. +# * Issue 51: remove head.tmp and body.tmp in make clean invocation +# * Issue 56: maintain multiple versions of log files (for debugging) +# Chris Monson (2009-11-14): +# * Bumped version to 2.1.36 +# * Issues 53 and 49: added .brf, .mtc, and .maf to the cleanables +# Chris Monson (2009-11-05): +# * Bumped version to 2.1.35 +# * Added nomenclature support (see issue 48) +# Chris Monson (2009-10-29): +# * Bumped version to 2.1.34 +# * Fixed _out_ creation bug introduced in 2.1.33 (it was always created) +# * Fixed erroneous help output for $HOME in BINARY_TARGET_DIR +# * Changed contact email address - bring on the spam! +# Chris Monson (2009-10-21): +# * Bumped version to 2.1.33 +# * Fixed issue 46, adding support for dot2tex (thanks to fdemesmay) +# * Made all_files.* settable in Makefile.ini (using ?= instead of :=) +# * Fixed issue 47, thanks to fdemesmay: add binary copy directory, copy +# dvi, pdf, and ps if it exists +# Chris Monson (2009-09-25): +# * Bumped version to 2.1.32 +# * Fixed so that a changed lol file will cause a rebuild +# * Added .lol files to the cleanable list +# Chris Monson (2009-09-08): +# * Bumped version to 2.1.31 +# * Closed issue 43: evince doesn't notice pdf change w/out touch +# Chris Monson (2009-08-28): +# * Bumped version to 2.1.30 +# * Closed issue 39: Capture multi-line log warnings/errors to output +# Chris Monson (2009-08-26): +# * Bumped version to 2.1.29 +# * Closed issue 42: add svg support using inkscape +# Chris Monson (2009-08-17): +# * Bumped version to 2.1.28 +# * Patch from paul.biggar for issue 38: package warnings are overlooked +# Chris Monson (2009-08-07): +# * Bumped version to 2.1.27 +# * Included patch for issue 37 - removes pdf/ps files before copying, +# allowing some broken viewers to see changes properly. +# Chris Monson (2009-05-15): +# * Bumped version to 2.1.26 +# * Included patch for issue 9 from favonia - detects .fig changes for +# pstex files during regular compilation, so long as the pstex +# has been built at least once with make all-pstex. +# Chris Monson (2009-03-27): +# * Bumped version to 2.1.25 +# * Cleaned up a bunch of variable setting stuff - more stuff is now +# settable from Makefile.ini +# * Cleaned up documentation for various features, especially settable +# variables. +# * issue 28: support for png -> eps conversion (it even looks good!) +# * issue 29: support for "neverclean" files in Makefile.ini +# * issue 30: make ps2pdf14 the default - fall back when not there +# Chris Monson (2009-03-09): +# * Bumped version to 2.1.24 +# * issue 27: xmgrace support (thanks to rolandschulzhd) +# Chris Monson (2008-10-23): +# * Bumped version to 2.1.23 +# * issue 23: fixed _check_programs to not use bash string subs +# Chris Monson (2008-09-02): +# * Bumped version to 2.1.22 +# * Appled patch from Holger <yllohy@googlemail.com> to add include +# sources and some documentation updates. +# * Updated backup_patterns to be a bit more aggressive (also thanks to +# Holger) +# Chris Monson (2008-08-30): +# * Bumped version to 2.1.21 +# * Added ability to specify onlysources.* variables to indicate the only +# files that should *not* be considered includes. Thanks to Holger +# <yllohy@googlemail.com> for this patch. +# * Added an automatic include of Makefile.ini if it exists. Allows +# settings to be made outside of this makefile. +# Chris Monson (2008-05-21): +# * Bumped version to 2.1.20 +# * Added manual pstex compilation support (run make all-pstex first) +# * Removed all automatic pstex support. It was totally breaking +# everything and is very hard to incorporate into the makefile +# concept because it requires LaTeX to *fail* before it can +# determine that it needs the files. +# Chris Monson (2008-04-17): +# * Bumped version to 2.1.19 +# * Changed the pstex build hack to be on by default +# Chris Monson (2008-04-09): +# * Bumped version to 2.1.18 +# * issue 16: fixed pstex build problems, seems nondeterministic. Added +# gratuitious hack for testing: set PSTEX_BUILD_ALL_HACK=1. +# Chris Monson (2008-04-09): +# * Bumped version to 2.1.17 +# * issue 20: fixed accumulation of <pid>*.make files - wildcard was +# refusing to work on files that are very recently created. +# Chris Monson (2008-04-02): +# * Bumped version to 2.1.16 +# * issue 19: Removed the use of "type" to fix broken "echo" settings +# Chris Monson (2008-03-27): +# * Bumped version to 2.1.15 +# * issue 18: Favors binary echo over builtin, as binary understands -n +# * issue 16: Fixed handling of missing pstex_t files in the log +# * issue 9: Added .SECONDARY target for .pstex files +# Chris Monson (2008-03-21): +# * Bumped version to 2.1.14 +# * Fixed broken aux file flattening, which caused included bibs to be +# missed. +# Chris Monson (2008-03-20): +# * Bumped version to 2.1.13 +# * Changed error output colorization to show errors for missing files +# that are not graphics files. +# Chris Monson (2008-03-20): +# * Bumped version to 2.1.12 +# * Fixed a regression introduced in r28 that makes bibtex fail when +# there is no index file present +# Chris Monson (2008-03-03): +# * Bumped version to 2.1.11 +# * Fixed issue 11 (handle index files, reported by abachn) +# * Cleaned up some comments and help text +# Chris Monson (2008-01-24): +# * Bumped version to 2.1.10 +# * Fixed to work when 'sh' is a POSIX shell like 'dash' +# Chris Monson (2007-12-12): +# * Bumped version to 2.1.9 +# * Fixed documentation and dependency graph for pstex files +# Chris Monson (2007-12-12): +# * Bumped version to 2.1.8 +# * Added basic pstex_t support for fig files (Issue 9 by favonia) +# I still suggest that psfrag be used instead. +# Chris Monson (2007-10-16): +# * Bumped version to 2.1.7 +# * Removed todo item: allow other comment directives for rst conversion +# * Added ability to use global rst style file _rststyle_._include_.tex +# * Added help text to that effect +# Chris Monson (2007-05-20): +# * Bumped version to 2.1.6 +# * Changed default paper size for rst files +# * Added todo item: fix paper size for rst files +# * Added todo item: allow other comment directives for rst conversion +# Chris Monson (2007-04-02): +# * Bumped version to 2.1.5 +# * Addressed Issue 7, incorrect .gpi.d generation in subdirectories +# Chris Monson (2007-03-28): +# * Bumped version to 2.1.4 +# * Fixed syntax error in dot output +# Chris Monson (2007-03-01): +# * Bumped version to 2.1.3 +# * Added reST to the included documentation +# * Fixed graphics and script generation to be settable in the +# environment. +# Chris Monson (2007-02-23): +# * Bumped version to 2.1.2 +# * Added the ability to generate .tex files from .rst files +# Chris Monson (2006-10-17): +# * Bumped version to 2.1.1 +# * Fixed includes from subdirectories (sed-to-sed slash escape problem) +# Chris Monson (2006-10-05): +# * Bumped version to 2.1.0 (pretty serious new feature added) +# * New feature: bib files can now be anywhere on the BIBINPUTS path +# * New programs: kpsewhich (with tetex) and xargs (BSD) +# Chris Monson (2006-09-28): +# * Bumped version to 2.0.9 +# * Added ability to parse more than one bibliography +# Chris Monson (2006-06-01): +# * Bumped version to 2.0.8 +# * Added .vrb to the list of cleaned files +# Chris Monson (2006-04-26): +# * Bumped version to 2.0.7 +# * Fixed so that clean-nographics does not remove .gpi.d files +# * Removed jpg -> eps hack (not working properly -- just pre-convert) +# * Fixed so that postscript grayscale can be done with BSD sed +# Chris Monson (2006-04-25): +# * Bumped version to 2.0.6 +# * Fixed so that changed toc, lot, lof, or out causes a rebuild +# Chris Monson (2006-04-17): +# * Bumped version to 2.0.5 +# * Added jpg -> eps conversion target +# Chris Monson (2006-04-12): +# * Bumped version to 2.0.4 +# * Fixed BSD sed invocation to not use \| as a branch delimiter +# * Added a comment section on what is and is not allowed in BSD sed +# * Made paper size handling more robust while I was at it +# * Fixed postscript RGB grayscale to use a weighted average +# * Fixed postscript HSB grayscale to convert to RGB first +# * Fixed a problem with rebuilding .bbl files +# Chris Monson (2006-04-11): +# * Bumped version to 2.0.3 +# * Fixed some BSD sed problems: can't use \n in substitutions +# Chris Monson (2006-04-10): +# * Bumped version to 2.0.2 +# * Once again removed ability to create .tex files from scripts +# * \includeonly works again +# Chris Monson (2006-04-09): +# * Bumped version to 2.0.1 +# * Fixed grayscale postscript handling to be more robust +# * Added ability to generate ._gray_. files from eps and eps.gz +# * Added ability to clean ._gray_.eps files created from .eps files +# Chris Monson (2006-04-07): +# * Bumped version to 2.0.0 +# * Removed clunky ability to create included .tex files from scripts +# * Added note in the help about included tex scripting not working +# * Fixed the .eps generation to delete %.gpihead.make when finished +# * Abandoned designs to use shell variables to create sed scripts +# * Abandoned __default__.tex.sh idea: it causes recursion with %: . +# * Removed web page to-do. All items are now complete. +# * Added better grayscale conversion for dot figures (direct ps fixup). +# * Include files can now be scripted (at the expense of \includeonly). +# * Updated dependency graph to contain better node names. +# Chris Monson (2006-04-06): +# * Bumped version to 2.0b3 +# * Top level includes now fail if there is no rule to build them +# * A helpful message is printed when they do fail +# * Grayscale has been changed to be ._gray_, other phonies use _ now, too +# * Grayscale handling has been completed +# * Changed _include_stems target to _includes target. +# * Fixed _includes target to be useful by itself. +# * Removed the ability to specify clean and build targets at once +# * Verified that epsfig works fine with current code +# * Fixed included scripts so that they are added to the dep files +# * Fixed so that graphics includes don't happen if they aren't for gpi +# * Fixed dot output to allow grayscale. +# Chris Monson (2006-04-05): +# * Bumped version to 2.0b2 +# * Removed automatic -gray output. It needs fixing in a bad way. +# * Revamped dependency creation completely. +# * Fixed conditional inclusion to actually work (test.nobuild.d, test.d). +# * Fixed clean target to remove log targets +# * Added the 'monochrome' word for gray gpi output +# * Added a _check_gpi_files target that checks for common problems +# * Changed the _version target into the version target (no _) +# * Added better handling of grayscale files. Use the .gray.pdf target. +# * Fixed testing for rebuilds +# Chris Monson (2006-04-04): +# * Bumped version to 2.0b1 +# * Changed colorization of output +# * Made .auxbbl and .auxtex .make files secondary targets +# * Shortened and simplified the final latex invocation loop +# * Added version-specific output ($$i vs. $$$$i) in latex loop +# * Added a build message for the first .dvi run (Building .dvi (0)) +# * Removed some build messages that most people don't care about. +# * Simplified procedure for user-set colors -- simple text specification +# * Fixed diff output to...not output. +# * Fixed rerun bug -- detect not only when preceded with LaTeX Warning +# * Sped up gpi plotting +# * Added error handling and colorized output for gpi failure +# * Documented color changing stuff. +# * Now sort the flattened aux file to avoid false recompilation needs +# * Added clean-nographics target +# * Don't remove self.dvi file if self.aux is missing in the log +# * Clarified some code. Did some very minor adjusting. +# Chris Monson (2006-04-03): +# * Bumped version to 2.0a7 +# * Added .dvi and .ps files as secondary files. +# * Fixed handling of multiple run detection when includeonly is in use. +# * Added code to flatten .aux files. +# * Added more files as .SECONDARY prerequisites to avoid recompilation. +# * Fixed the inputs generation to be much simpler and to use pipes. +# * Added the dependency graph directly into the makefile. +# * Changed flatten-aux to remove \@writefile \relax \newlabel, etc. +# * Undid pipe changes with sed usage (BSD sed doesn't know -f-). +# * Added a _check_programs target that tells you what your system has. +# * Fixed an error in colorization that made unnecessary errors appear +# * Added view targets. +# * Updated help text. +# * Augmented cookies so that .aux can trigger .bbl and .dvi rebuilds +# * Added more informative error handling for dvips and ps2pdf +# Chris Monson (2006-04-02): +# * Bumped version to 2.0a6 +# * Added indirection to .bbl dependencies to avoid rebuilding .bbl files +# * Streamlined the diff invocation to eliminate an existence test +# * Removed special shell quote escape variables +# * Moved includes to a more prominent location +# * Fixed .inputs.make to not contain .aux files +# * Fixed embedding to use a file instead of always grepping. +# * Added *.make.temp to the list of cleanable files +# * Fixed Ruby. It should now be supported properly. +# * Now differentiate between all, default, and buildable files. +# * Fixed to bail out on serious errors. +# * Revised the handling of includable files. Still working on it. +# Chris Monson (2006-03-31): +# * Bumped version to 2.0a5 +# * Fixed a bug with LaTeX error detection (there can be spaces) +# * Added .bbl support, simplifying everything and making it more correct +# * Refactored some tests that muddy the code +# * Did a little cleanup of some shell loops that can safely be make loops +# * Added support for graphviz .dot files +# * Made _all_programs output easier to read +# * Added the ruby support that has long been advertised +# * Font embedding was screwed up for PostScript -- now implicit +# * Changed the generation of -gray.gpi files to a single command +# * Changed any make-generated file that is not included from .d to .make +# Chris Monson (2006-03-30): +# * Bumped version to 2.0a4 +# * Fixed a bug with very long graphics file names +# * Added a todo entry for epsfig support +# * Fixed a bug paper size bug: sometimes more than one entry appears +# * Fixed DVI build echoing to display the number instead of process ID +# * DVI files are now removed on first invocation if ANY file is missing +# * Added a simple grayscale approach: if a file ends with -gray.gpi, it +# is created from the corresponding .gpi file with a special +# comment ##GRAY in its header, which causes coloring to be +# turned off. +# * Fixed a bug in the handling of .tex.sh files. For some reason I had +# neglected to define file stems for scripted output. +# * Removed a trailing ; from the %.graphics dependencies +# * Added dvips embedding (I think it works, anyway) +# Chris Monson (2006-03-29): +# * Bumped version to 2.0a3 +# * Fixed error in make 3.79 with MAKEFILE_LIST usage +# * Added the presumed filename to the _version output +# * Added a vim macro for converting sed scripts to make commands +# * Added gpi dependency support (plotting external files and loading gpi) +# * Allow .gpi files to be ignored if called .include.gpi or .nobuild.gpi +# * Fixed sed invocations where \+ was used. BSD sed uses \{1,\}. +# Chris Monson (2006-03-28): +# * Bumped version to 2.0a2 +# * Added SHELL_DEBUG and VERBOSE options +# * Changed the default shell back to /bin/sh (unset, in other words) +# * Moved .PHONY declarations closer to their targets +# * Moved help text into its own define block to obtain better formatting +# * Removed need for double-entry when adding a new program invocation +# * Moved .SECONDARY declaration closer to its relevant occurrence +# * Commented things more heavily +# * Added help text about setting terminal and output in gnuplot +# * Created more fine-grained clean targets +# * Added a %.graphics target that generates all of %'s graphics +# * Killed backward-compatible graphics generation (e.g., eps.gpi=gpi.eps) +# * For now, we're just GPL 2, not 3. Maybe it will change later +# * Made the version and svninfo into variables +# Chris Monson (2006-03-27): +# * Bumped version to 2.0a1 +# * Huge, sweeping changes -- automatic dependencies +# + +# IMPORTANT! +# +# When adding to the following list, do not introduce any blank lines. The +# list is extracted for documentation using sed and is terminated by a blank +# line. +# +# EXTERNAL PROGRAMS: +# = ESSENTIAL PROGRAMS = +# == Basic Shell Utilities == +CAT ?= cat +CP ?= cp -f +DIFF ?= diff +ECHO ?= echo +EGREP ?= egrep +ENV ?= env +EXPR ?= expr +MV ?= mv -f +SED ?= sed +SORT ?= sort +TOUCH ?= touch +UNIQ ?= uniq +WHICH ?= which +XARGS ?= xargs +SLEEP ?= sleep +# == LaTeX (tetex-provided) == +BIBTEX ?= bibtex +DVIPS ?= dvips +LATEX ?= latex +PDFLATEX ?= pdflatex +XELATEX ?= xelatex +EPSTOPDF ?= epstopdf +MAKEINDEX ?= makeindex +XINDY ?= xindy +KPSEWHICH ?= kpsewhich +GS ?= gs +# = OPTIONAL PROGRAMS = +# == For MikTex under Cygwin, to get path names right +CYGPATH ?= cygpath +# == Makefile Color Output == +TPUT ?= tput +# == TeX Generation == +PERL ?= perl +PYTHON ?= python +RST2LATEX ?= rst2latex.py +# == EPS Generation == +CONVERT ?= convert # ImageMagick +DOT ?= dot # GraphViz +DOT2TEX ?= dot2tex # dot2tex - add options (not -o) as needed +FIG2DEV ?= fig2dev # XFig +GNUPLOT ?= gnuplot # GNUplot +INKSCAPE ?= inkscape # Inkscape (svg support) +XMGRACE ?= xmgrace # XMgrace +PNGTOPNM ?= pngtopnm # From NetPBM - step 1 for png -> eps +PPMTOPGM ?= ppmtopgm # From NetPBM - (gray) step 2 for png -> eps +PNMTOPS ?= pnmtops # From NetPBM - step 3 for png -> eps +GUNZIP ?= gunzip # GZipped EPS +# == Beamer Enlarged Output == +PSNUP ?= psnup +# == Viewing Stuff == +VIEW_POSTSCRIPT ?= gv +VIEW_PDF ?= xpdf +VIEW_GRAPHICS ?= display + +# Xindy glossaries +XINDYLANG ?= english +XINDYENC ?= utf8 + +# If cygpath is present, then we create a path-norm function that uses it, +# otherwise the function is just a no-op. Issue 112 has details. +USE_CYGPATH := $(if $(shell $(WHICH) $(CYGPATH) 2>/dev/null),yes,) + +# $(call get-cygpath,<path>) +define get-cygpath +$(shell $(CYGPATH) -u "$(shell $(CYGPATH) -s -w $1)") +endef + +define path-norm +$(if $(USE_CYGPATH),$(call get-cygpath,$1),$1) +endef + +# Command options for embedding fonts and postscript->pdf conversion +PS_EMBED_OPTIONS ?= -dPDFSETTINGS=/printer -dEmbedAllFonts=true -dSubsetFonts=true -dMaxSubsetPct=100 +PS_COMPATIBILITY ?= 1.4 + +# If set to something, will cause temporary files to not be deleted immediately +KEEP_TEMP ?= + +# Defaults for GPI +DEFAULT_GPI_EPS_FONTSIZE ?= 22 +DEFAULT_GPI_PDF_FONTSIZE ?= 12 + +# Style file for ReST +RST_STYLE_FILE ?= $(wildcard _rststyle_._include_.tex) + +# This ensures that even when echo is a shell builtin, we still use the binary +# (the builtin doesn't always understand -n) +FIXED_ECHO := $(if $(findstring -n,$(shell $(ECHO) -n)),$(shell which echo),$(ECHO)) +ECHO := $(if $(FIXED_ECHO),$(FIXED_ECHO),$(ECHO)) + +define determine-gnuplot-output-extension +$(if $(shell $(WHICH) $(GNUPLOT) 2>/dev/null), + $(if $(findstring unknown or ambiguous, $(shell $(GNUPLOT) -e "set terminal pdf" 2>&1)), + eps, pdf), + none) +endef + +GNUPLOT_OUTPUT_EXTENSION ?= $(strip $(call determine-gnuplot-output-extension)) + +# Internal code should use this because of :=. This means that the potentially +# expensive script invocation used to determine whether pdf is available will +# only be run once. +GPI_OUTPUT_EXTENSION := $(strip $(GNUPLOT_OUTPUT_EXTENSION)) + +# Note, if the terminal *does* understand fsize, then we expect this call to +# create a specific error here: "fsize: expecting font size". Otherwise, we +# assume that fsize is not understood. +GPI_FSIZE_SYNTAX := $(strip \ +$(if \ + $(filter pdf,$(GPI_OUTPUT_EXTENSION)),\ + $(if \ + $(findstring fsize: expecting font size,$(shell $(GNUPLOT) -e "set terminal pdf fsize" 2>&1)),\ + fsize FONTSIZE,\ + font ",FONTSIZE"),\ + FONTSIZE)) + +# Directory into which we place "binaries" if it exists. +# Note that this can be changed on the commandline or in Makefile.ini: +# +# Command line: +# make BINARY_TARGET_DIR=$HOME/pdfs myfile.pdf +# +# Also, you can specify a relative directory (relative to the Makefile): +# make BINARY_TARGET_DIR=pdfs myfile.pdf +# +# Or, you can use Makefile.ini: +# +# BINARY_TARGET_DIR := $(HOME)/bin_out +# +BINARY_TARGET_DIR ?= _out_ + +RESTARTS := $(if $(MAKE_RESTARTS),$(MAKE_RESTARTS),0) +# SH NOTES +# +# On some systems, /bin/sh, which is the default shell, is not linked to +# /bin/bash. While bash is supposed to be sh-compatible when invoked as sh, it +# just isn't. This section details some of the things you have to stay away +# from to remain sh-compatible. +# +# * File pattern expansion does not work for {} +# * [ "$x" = "$y" ] has to be [ x"$x" x"$y" ] +# * &> for stderr redirection doesn't work, use 2>&1 instead +# +# BSD SED NOTES +# +# BSD SED is not very nice compared to GNU sed, but it is the most +# commonly-invoked sed on Macs (being based on BSD), so we have to cater to +# it or require people to install GNU sed. It seems like the GNU +# requirement isn't too bad since this makefile is really a GNU makefile, +# but apparently GNU sed is much less common than GNU make in general, so +# I'm supporting it here. +# +# Sad experience has taught me the following about BSD sed: +# +# * \+ is not understood to mean \{1,\} +# * \| is meaningless (does not branch) +# * \n cannot be used as a substitution character +# * ? does not mean \{0,1\}, but is literal +# * a\ works, but only reliably for a single line if subsequent lines +# have forward slashes in them (as is the case in postscript) +# +# For more info (on the Mac) you can consult +# +# man -M /usr/share/man re_format +# +# And look for the word "Obsolete" near the bottom. + +# +# EXTERNAL PROGRAM DOCUMENTATION SCRIPT +# + +# $(call output-all-programs,[<output file>]) +define output-all-programs + [ -f '$(this_file)' ] && \ + $(SED) \ + -e '/^[[:space:]]*#[[:space:]]*EXTERNAL PROGRAMS:/,/^$$/!d' \ + -e '/EXTERNAL PROGRAMS/d' \ + -e '/^$$/d' \ + -e '/^[[:space:]]*#/i\ '\ + -e 's/^[[:space:]]*#[[:space:]][^=]*//' \ + $(this_file) $(if $1,> '$1',) || \ + $(ECHO) "Cannot determine the name of this makefile." +endef + +# If they misspell gray, it should still work. +GRAY ?= $(call get-default,$(GREY),) + +# +# Utility Functions and Definitions +# + +# Don't call this directly - it is here to avoid calling wildcard more than +# once in remove-files. +remove-files-helper = $(if $1,$(RM) $1,$(sh_true)) + +# $(call remove-files,file1 file2) +remove-files = $(call remove-files-helper,$(wildcard $1)) + +# Removes all cleanable files in the given list +# $(call clean-files,file1 file2 file3 ...) +# Works exactly like remove-files, but filters out files in $(neverclean) +clean-files = \ + $(call remove-files-helper,$(call cleanable-files,$(wildcard $1))) + +# Outputs all generated files to STDOUT, along with some others that are +# created by these (e.g., .idx files end up producing .ilg and .ind files). +# Discovered by reading *.fls OUTPUT lines and producing corresponding .ind +# filenames as needed. +# +# $(call get-generated-names,<source recorder file (*.fls)>) +define get-generated-names +[ -f '$1' ] && \ +$(SED) \ + -e '/^OUTPUT /{' \ + -e ' s///' \ + -e ' p' \ + -e ' s/\.idx/\.ind/p' \ + -e ' s/\.ind/\.ilg/p' \ + -e '}' \ + -e 'd' \ + '$1' \ +| $(SORT) | $(UNIQ) +endef + +# This removes files without checking whether they are there or not. This +# sometimes has to be used when the file is created by a series of shell +# commands, but there ends up being a race condition: make doesn't know about +# the file generation as quickly as the system does, so $(wildcard ...) doesn't +# work right. Blech. +# $(call remove-temporary-files,filenames) +remove-temporary-files = $(if $(KEEP_TEMP),:,$(if $1,$(RM) $1,:)) + +# Create an identifier from a file name +# $(call cleanse-filename,filename) +cleanse-filename = $(subst .,_,$(subst /,__,$1)) + +# Escape dots +# $(call escape-fname-regex,str) +escape-fname-regex = $(subst /,\\/,$(subst .,\\.,$1)) + +# Test that a file exists +# $(call test-exists,file) +test-exists = [ -e '$1' ] + +# $(call move-files,source,destination) +move-if-exists = $(call test-exists,$1) && $(MV) '$1' '$2' + +# Copy file1 to file2 only if file2 doesn't exist or they are different +# $(call copy-if-different,sfile,dfile) +copy-if-different = $(call test-different,$1,$2) && $(CP) '$1' '$2' +copy-if-exists = $(call test-exists,$1) && $(CP) '$1' '$2' +move-if-different = $(call test-different,$1,$2) && $(MV) '$1' '$2' +replace-if-different-and-remove = \ + $(call test-different,$1,$2) \ + && $(MV) '$1' '$2' \ + || $(call remove-files,'$1') + +# Note that $(DIFF) returns success when the files are the SAME.... +# $(call test-different,sfile,dfile) +test-different = ! $(DIFF) -q '$1' '$2' >/dev/null 2>&1 +test-exists-and-different = \ + $(call test-exists,$2) && $(call test-different,$1,$2) + +# Return value 1, or value 2 if value 1 is empty +# $(call get-default,<possibly empty arg>,<default value if empty>) +get-default = $(if $1,$1,$2) + +# Copy a file and log what's going on +# $(call copy-with-logging,<source>,<target>) +define copy-with-logging +if [ -d '$2/' ]; then \ + if $(CP) '$1' '$2/'; then \ + $(ECHO) "$(C_INFO)Copied '$1' to '$2/'$(C_RESET)"; \ + else \ + $(ECHO) "$(C_ERROR)Failed to copy '$1' to '$2/'$(C_RESET)"; \ + fi; \ +fi +endef + +# Gives a reassuring message about the failure to find include files +# $(call include-message,<list of include files>) +define include-message +$(strip \ +$(if $(filter-out $(wildcard $1),$1),\ + $(shell $(ECHO) \ + "$(C_INFO)NOTE: You may ignore warnings about the"\ + "following files:" >&2;\ + $(ECHO) >&2; \ + $(foreach s,$(filter-out $(wildcard $1),$1),$(ECHO) ' $s' >&2;)\ + $(ECHO) "$(C_RESET)" >&2) +)) +endef +# Characters that are hard to specify in certain places +space := $(empty) $(empty) +colon := \: +comma := , + +# Useful shell definitions +sh_true := : +sh_false := ! : + +# Clear out the standard interfering make suffixes +.SUFFIXES: + +# Turn off forceful rm (RM is usually mapped to rm -f) +ifdef SAFE_RM +RM := rm +endif + +# Turn command echoing back on with VERBOSE=1 +ifndef VERBOSE +QUIET := @ +endif + +# Turn on shell debugging with SHELL_DEBUG=1 +# (EVERYTHING is echoed, even $(shell ...) invocations) +ifdef SHELL_DEBUG +SHELL += -x +endif + +# Get the name of this makefile (always right in 3.80, often right in 3.79) +# This is only really used for documentation, so it isn't too serious. +ifdef MAKEFILE_LIST +this_file := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) +else +this_file := $(wildcard GNUmakefile makefile Makefile) +endif + +# Terminal color definitions + +REAL_TPUT := $(if $(NO_COLOR),,$(shell $(WHICH) $(TPUT))) + +# $(call get-term-code,codeinfo) +# e.g., +# $(call get-term-code,setaf 0) +get-term-code = $(if $(REAL_TPUT),$(shell $(REAL_TPUT) $1),) + +black := $(call get-term-code,setaf 0) +red := $(call get-term-code,setaf 1) +green := $(call get-term-code,setaf 2) +yellow := $(call get-term-code,setaf 3) +blue := $(call get-term-code,setaf 4) +magenta := $(call get-term-code,setaf 5) +cyan := $(call get-term-code,setaf 6) +white := $(call get-term-code,setaf 7) +bold := $(call get-term-code,bold) +uline := $(call get-term-code,smul) +reset := $(call get-term-code,sgr0) + +# +# User-settable definitions +# +LATEX_COLOR_WARNING ?= magenta +LATEX_COLOR_ERROR ?= red +LATEX_COLOR_INFO ?= green +LATEX_COLOR_UNDERFULL ?= magenta +LATEX_COLOR_OVERFULL ?= red bold +LATEX_COLOR_PAGES ?= bold +LATEX_COLOR_BUILD ?= cyan +LATEX_COLOR_GRAPHIC ?= yellow +LATEX_COLOR_DEP ?= green +LATEX_COLOR_SUCCESS ?= green bold +LATEX_COLOR_FAILURE ?= red bold + +# Gets the real color from a simple textual definition like those above +# $(call get-color,ALL_CAPS_COLOR_NAME) +# e.g., $(call get-color,WARNING) +get-color = $(subst $(space),,$(foreach c,$(LATEX_COLOR_$1),$($c))) + +# +# STANDARD COLORS +# +C_WARNING := $(call get-color,WARNING) +C_ERROR := $(call get-color,ERROR) +C_INFO := $(call get-color,INFO) +C_UNDERFULL := $(call get-color,UNDERFULL) +C_OVERFULL := $(call get-color,OVERFULL) +C_PAGES := $(call get-color,PAGES) +C_BUILD := $(call get-color,BUILD) +C_GRAPHIC := $(call get-color,GRAPHIC) +C_DEP := $(call get-color,DEP) +C_SUCCESS := $(call get-color,SUCCESS) +C_FAILURE := $(call get-color,FAILURE) +C_RESET := $(reset) + +# +# PRE-BUILD TESTS +# + +# Check that clean targets are not combined with other targets (weird things +# happen, and it's not easy to fix them) +hascleangoals := $(if $(sort $(filter clean clean-%,$(MAKECMDGOALS))),1) +hasbuildgoals := $(if $(sort $(filter-out clean clean-%,$(MAKECMDGOALS))),1) +ifneq "$(hasbuildgoals)" "" +ifneq "$(hascleangoals)" "" +$(error $(C_ERROR)Clean and build targets specified together$(C_RESET))) +endif +endif + +# +# VARIABLE DECLARATIONS +# + +# Names of sed scripts that morph gnuplot files -- only the first found is used +GNUPLOT_SED := global-gpi.sed gnuplot.sed +GNUPLOT_GLOBAL := global._include_.gpi gnuplot.global + +ifeq "$(strip $(BUILD_STRATEGY))" "latex" +default_graphic_extension ?= eps +latex_build_program ?= $(LATEX) +build_target_extension ?= dvi +hyperref_driver_pattern ?= hdvips +hyperref_driver_error ?= Using dvips: specify ps2pdf in the hyperref options. +endif + +ifeq "$(strip $(BUILD_STRATEGY))" "pdflatex" +default_graphic_extension ?= pdf +latex_build_program ?= $(PDFLATEX) +build_target_extension ?= pdf +hyperref_driver_pattern ?= hpdf.* +hyperref_driver_error ?= Using pdflatex: specify pdftex in the hyperref options (or leave it blank). +endif + +ifeq "$(strip $(BUILD_STRATEGY))" "xelatex" +default_graphic_extension ?= pdf +latex_build_program ?= $(XELATEX) +build_target_extension ?= pdf +hyperref_driver_pattern ?= hdvipdf.* +hyperref_driver_error ?= Using pdflatex: specify pdftex in the hyperref options (or leave it blank). +endif + +# Files of interest +all_files.tex ?= $(wildcard *.tex) +all_files.tex.sh ?= $(wildcard *.tex.sh) +all_files.tex.pl ?= $(wildcard *.tex.pl) +all_files.tex.py ?= $(wildcard *.tex.py) +all_files.rst ?= $(wildcard *.rst) +all_files.fig ?= $(wildcard *.fig) +all_files.gpi ?= $(wildcard *.gpi) +all_files.dot ?= $(wildcard *.dot) +all_files.xvg ?= $(wildcard *.xvg) +all_files.svg ?= $(wildcard *.svg) +all_files.png ?= $(wildcard *.png) +all_files.jpg ?= $(wildcard *.jpg) +all_files.jpeg ?= $(wildcard *.jpeg) +all_files.eps.gz ?= $(wildcard *.eps.gz) +all_files.eps ?= $(wildcard *.eps) + +# Utility function for obtaining all files not specified in $(neverclean) +# $(call cleanable-files,file1 file2 file3 ...) +# Returns the list of files that is not in $(wildcard $(neverclean)) +cleanable-files = $(filter-out $(wildcard $(neverclean)), $1) + +# Utility function for getting all .$1 files that are to be ignored +# * files listed in $(includes.$1) +# * files not listed in $(onlysources.$1) if it is defined +ignore_files = \ + $(includes.$1) \ + $(if $(onlysources.$1),$(filter-out $(onlysources.$1), $(all_files.$1))) + +# Patterns to never be allowed as source targets +ignore_patterns := %._include_ + +# Patterns allowed as source targets but not included in 'all' builds +nodefault_patterns := %._nobuild_ $(ignore_patterns) + +# Utility function for getting targets suitable building +# $(call filter-buildable,suffix) +filter-buildable = \ + $(filter-out $(call ignore_files,$1) \ + $(addsuffix .$1,$(ignore_patterns)),$(all_files.$1)) + +# Utility function for getting targets suitable for 'all' builds +# $(call filter-default,suffix) +filter-default = \ + $(filter-out $(call ignore_files,$1) \ + $(addsuffix .$1,$(nodefault_patterns)),$(all_files.$1)) + +# Top level sources that can be built even when they are not by default +files.tex := $(call filter-buildable,tex) +files.tex.sh := $(call filter-buildable,tex.sh) +files.tex.pl := $(call filter-buildable,tex.pl) +files.tex.py := $(call filter-buildable,tex.py) +files.rst := $(call filter-buildable,rst) +files.gpi := $(call filter-buildable,gpi) +files.dot := $(call filter-buildable,dot) +files.fig := $(call filter-buildable,fig) +files.xvg := $(call filter-buildable,xvg) +files.svg := $(call filter-buildable,svg) +files.png := $(call filter-buildable,png) +files.jpg := $(call filter-buildable,jpg) +files.jpeg := $(call filter-buildable,jpeg) +files.eps.gz := $(call filter-buildable,eps.gz) +files.eps := $(call filter-buildable,eps) + +# Make all pstex targets secondary. The pstex_t target requires the pstex +# target, and nothing else really depends on it, so it often gets deleted. +# This avoids that by allowing *all* fig files to be pstex targets, which is +# perfectly valid and causes no problems even if they're going to become eps +# files in the end. +.SECONDARY: $(patsubst %.fig,%.pstex,$(files.fig)) + +# Top level sources that are built by default targets +default_files.tex := $(call filter-default,tex) +default_files.tex.sh := $(call filter-default,tex.sh) +default_files.tex.pl := $(call filter-default,tex.pl) +default_files.tex.py := $(call filter-default,tex.py) +default_files.rst := $(call filter-default,rst) +default_files.gpi := $(call filter-default,gpi) +default_files.dot := $(call filter-default,dot) +default_files.fig := $(call filter-default,fig) +default_files.xvg := $(call filter-default,xvg) +default_files.svg := $(call filter-default,svg) +default_files.png := $(call filter-default,png) +default_files.jpg := $(call filter-default,jpg) +default_files.jpeg := $(call filter-default,jpeg) +default_files.eps.gz := $(call filter-default,eps.gz) +default_files.eps := $(call filter-default,eps) + +# Utility function for creating larger lists of files +# $(call concat-files,suffixes,[prefix]) +concat-files = $(foreach s,$1,$($(if $2,$2_,)files.$s)) + +# Useful file groupings +all_files_source := $(call concat-files,tex,all) +all_files_scripts := $(call concat-files,tex.sh tex.pl tex.py rst,all) + +.PHONY: $(all_files_scripts) + +default_files_source := $(call concat-files,tex,default) +default_files_scripts := $(call concat-files,tex.sh tex.pl tex.py rst,default) + +files_source := $(call concat-files,tex) +files_scripts := $(call concat-files,tex.sh tex.pl tex.py rst) + +# Utility function for obtaining stems +# $(call get-stems,suffix,[prefix]) +get-stems = $(sort $($(if $2,$2_,)files.$1:%.$1=%)) + +# List of all stems (including ._include_ and ._nobuild_ file stems) +all_stems.tex := $(call get-stems,tex,all) +all_stems.tex.sh := $(call get-stems,tex.sh,all) +all_stems.tex.pl := $(call get-stems,tex.pl,all) +all_stems.tex.py := $(call get-stems,tex.py,all) +all_stems.rst := $(call get-stems,rst,all) +all_stems.fig := $(call get-stems,fig,all) +all_stems.gpi := $(call get-stems,gpi,all) +all_stems.dot := $(call get-stems,dot,all) +all_stems.xvg := $(call get-stems,xvg,all) +all_stems.svg := $(call get-stems,svg,all) +all_stems.png := $(call get-stems,png,all) +all_stems.jpg := $(call get-stems,jpg,all) +all_stems.jpeg := $(call get-stems,jpeg,all) +all_stems.eps.gz := $(call get-stems,eps.gz,all) +all_stems.eps := $(call get-stems,eps,all) + +# List of all default stems (all default PDF targets): +default_stems.tex := $(call get-stems,tex,default) +default_stems.tex.sh := $(call get-stems,tex.sh,default) +default_stems.tex.pl := $(call get-stems,tex.pl,default) +default_stems.tex.py := $(call get-stems,tex.py,default) +default_stems.rst := $(call get-stems,rst,default) +default_stems.fig := $(call get-stems,fig,default) +default_stems.gpi := $(call get-stems,gpi,default) +default_stems.dot := $(call get-stems,dot,default) +default_stems.xvg := $(call get-stems,xvg,default) +default_stems.svg := $(call get-stems,svg,default) +default_stems.png := $(call get-stems,png,default) +default_stems.jpg := $(call get-stems,jpg,default) +default_stems.jpeg := $(call get-stems,jpeg,default) +default_stems.eps.gz := $(call get-stems,eps.gz,default) +default_stems.eps := $(call get-stems,eps,default) + +# List of all stems (all possible bare PDF targets created here): +stems.tex := $(call get-stems,tex) +stems.tex.sh := $(call get-stems,tex.sh) +stems.tex.pl := $(call get-stems,tex.pl) +stems.tex.py := $(call get-stems,tex.py) +stems.rst := $(call get-stems,rst) +stems.fig := $(call get-stems,fig) +stems.gpi := $(call get-stems,gpi) +stems.dot := $(call get-stems,dot) +stems.xvg := $(call get-stems,xvg) +stems.svg := $(call get-stems,svg) +stems.png := $(call get-stems,png) +stems.jpg := $(call get-stems,jpg) +stems.jpeg := $(call get-stems,jpeg) +stems.eps.gz := $(call get-stems,eps.gz) +stems.eps := $(call get-stems,eps) + +# Utility function for creating larger lists of stems +# $(call concat-stems,suffixes,[prefix]) +concat-stems = $(sort $(foreach s,$1,$($(if $2,$2_,)stems.$s))) + +# The most likely to be source but not finished product go first +graphic_source_extensions := fig \ + gpi \ + xvg \ + svg \ + dot \ + eps.gz + +ifeq "$(strip $(BUILD_STRATEGY))" "latex" +graphic_source_extensions += png jpg jpeg +graphic_target_extensions := eps ps +endif + +ifeq "$(strip $(BUILD_STRATEGY))" "pdflatex" +graphic_source_extensions += eps +graphic_target_extensions := pdf png jpg jpeg mps tif +endif + +ifeq "$(strip $(BUILD_STRATEGY))" "xelatex" +graphic_source_extensions += eps +graphic_target_extensions := pdf png jpg jpeg mps tif +endif + +all_stems_source := $(call concat-stems,tex,all) +all_stems_script := $(call concat-stems,tex.sh tex.pl tex.py rst,all) +all_stems_graphic := $(call concat-stems,$(graphic_source_extensions),all) +all_stems_ss := $(sort $(all_stems_source) $(all_stems_script)) +all_stems_sg := $(sort $(all_stems_script)) +all_stems_ssg := $(sort $(all_stems_ss)) + +default_stems_source := $(call concat-stems,tex,default) +default_stems_script := $(call concat-stems,tex.sh tex.pl tex.py rst,default) +default_stems_ss := $(sort $(default_stems_source) $(default_stems_script)) +default_stems_sg := $(sort $(default_stems_script)) +default_stems_ssg := $(sort $(default_stems_ss)) + +stems_source := $(call concat-stems,tex) +stems_script := $(call concat-stems,tex.sh tex.pl tex.py rst) +stems_graphic := $(call concat-stems,$(graphic_source_extensions)) +stems_gg := $(sort $(stems_graphic)) +stems_ss := $(sort $(stems_source) $(stems_script)) +stems_sg := $(sort $(stems_script)) +stems_ssg := $(sort $(stems_ss)) + +# Calculate names that can generate the need for an include file. We can't +# really do this with patterns because it's too easy to screw up, so we create +# an exhaustive list. +allowed_source_suffixes := \ + pdf \ + ps \ + dvi \ + ind \ + nls \ + bbl \ + aux \ + aux.make \ + d \ + auxbbl.make \ + _graphics \ + _show +allowed_source_patterns := $(addprefix %.,$(allowed_source_suffixes)) + +allowed_graphic_suffixes := \ + pdf \ + eps \ + gpihead.make \ + gpi.d +allowed_graphic_patterns := $(addprefix %.,$(allowed_graphic_suffixes)) + +# All targets allowed to build documents +allowed_source_targets := \ + $(foreach suff,$(allowed_source_suffixes),\ + $(addsuffix .$(suff),$(stems_ssg))) + +# All targets allowed to build graphics +allowed_graphic_targets := \ + $(foreach suff,$(allowed_graphic_suffixes),\ + $(addsuffix .$(suff),$(stems_gg))) + +# All targets that build multiple documents (like 'all') +allowed_batch_source_targets := \ + all \ + all-pdf \ + all-ps \ + all-dvi \ + all-bbl \ + all-ind \ + all-gls \ + all-nls \ + show + +# All targets that build multiple graphics (independent of document) +allowed_batch_graphic_targets := \ + all-graphics \ + all-pstex \ + all-dot2tex \ + show-graphics + +# Now we figure out which stuff is available as a make target for THIS RUN. +real_goals := $(call get-default,$(filter-out _includes,$(MAKECMDGOALS)),\ + all) + +specified_source_targets := $(strip \ + $(filter $(allowed_source_targets) $(stems_ssg),$(real_goals)) \ + ) + +specified_batch_source_targets := $(strip \ + $(filter $(allowed_batch_source_targets),$(real_goals)) \ + ) + +specified_graphic_targets := $(strip \ + $(filter $(allowed_graphic_targets),$(real_goals)) \ + ) + +specified_batch_graphic_targets := $(strip \ + $(filter $(allowed_batch_graphic_targets),$(real_goals)) \ + ) + +specified_gpi_targets := $(patsubst %.gpi,%.$(default_graphic_extension),\ + $(filter $(patsubst %.$(default_graphic_extension),%.gpi,$(specified_graphic_targets)),\ + $(all_files.gpi)) \ + ) + +# Determine which .d files need including from the information gained above. +# This is done by first checking whether a batch target exists. If it does, +# then all *default* stems are used to create possible includes (nobuild need +# not apply for batch status). If no batch targets exist, then the individual +# targets are considered and appropriate includes are taken from them. +source_stems_to_include := \ + $(sort\ + $(if $(specified_batch_source_targets),\ + $(default_stems_ss),\ + $(foreach t,$(specified_source_targets),\ + $(foreach p,$(allowed_source_patterns),\ + $(patsubst $p,%,$(filter $p $(stems_ssg),$t)) \ + )) \ + )) + +# Determine which .gpi.d files are needed using the above information. We +# first check whether a batch target is specified, then check individual +# graphics that may have been specified. +graphic_stems_to_include := \ + $(sort\ + $(if $(specified_batch_graphic_targets),\ + $(default_stems.gpi),\ + $(foreach t,$(specified_gpi_targets),\ + $(foreach p,$(allowed_graphic_patterns),\ + $(patsubst $p,%,$(filter $p,$t)) \ + )) \ + )) + +# All dependencies for the 'all' targets +all_pdf_targets := $(addsuffix .pdf,$(stems_ssg)) +all_ps_targets := $(addsuffix .ps,$(stems_ssg)) +all_dvi_targets := $(addsuffix .dvi,$(stems_ssg)) +all_tex_targets := $(addsuffix .tex,$(stems_sg)) +all_d_targets := $(addsuffix .d,$(stems_ssg)) +all_graphics_targets := $(addsuffix .$(default_graphic_extension),$(stems_gg)) +all_pstex_targets := $(addsuffix .pstex_t,$(stems.fig)) +all_dot2tex_targets := $(addsuffix .dot_t,$(stems.dot)) + +all_known_graphics := $(sort $(all_graphics_targets) $(wildcard *.$(default_graphic_extension))) + +default_pdf_targets := $(addsuffix .pdf,$(default_stems_ss)) + +ifeq "$(strip $(BUILD_STRATEGY))" "latex" +default_ps_targets := $(addsuffix .ps,$(default_stems_ss)) +default_dvi_targets := $(addsuffix .dvi,$(default_stems_ss)) +pre_pdf_extensions := dvi ps +endif + +# Extensions generated by LaTeX invocation that can be removed when complete +rm_ext := \ + log *.log aux $(pre_pdf_extensions) pdf blg bbl out nav snm toc lof lot lol pfg \ + fls vrb idx ind ilg glg glo gls lox nls nlo nlg brf mtc maf brf ist +backup_patterns := *~ *.bak *.backup body.tmp head.tmp + +graph_stem := _graph + +# All LaTeX-generated files that can be safely removed + +rm_tex := \ + $(foreach e,$(rm_ext),$(addsuffix .$e,$(all_stems_source))) \ + $(foreach e,$(rm_ext) tex,$(addsuffix .$e,$(all_stems_sg))) \ + $(addsuffix .log,$(all_ps_targets) $(all_pdf_targets)) \ + $(addsuffix .*.log,$(stems_graphic)) + +# These are the files that will affect .gpi transformation for all .gpi files. +# +# Use only the first one found. Backward compatible values are at the end. +# Note that we use foreach, even though wildcard also returns a list, to ensure +# that the order in the uppercase variables is preserved. Directory listings +# provide no such guarantee, so we avoid relying on them. +gpi_sed := $(strip \ + $(firstword $(foreach f,$(GNUPLOT_SED),$(wildcard $f)))) +gpi_global := $(strip \ + $(firstword $(foreach f,$(GNUPLOT_GLOBAL),$(wildcard $f)))) + +# +# Functions used in generating output +# + +# Outputs all source dependencies to stdout. The first argument is the file to +# be parsed, the second is a list of files that will show up as dependencies in +# the new .d file created here. +# +# $(call get-inputs,<parsed file>,<target files>) +define get-inputs +$(SED) \ +-e '/^INPUT/!d' \ +-e 's!^INPUT \(\./\)\{0,1\}!!' \ +-e 's/[[:space:]]/\\ /g' \ +-e 's/\(.*\)\.aux$$/\1.tex/' \ +-e '/\.tex$$/b addtargets' \ +-e '/\.cls$$/b addtargets' \ +-e '/\.sty$$/b addtargets' \ +-e '/\.pstex_t$$/b addtargets' \ +-e '/\.dot_t$$/b addtargets' \ +-e 'd' \ +-e ':addtargets' \ +-e 's!.*!$2: $$(call path-norm,&)!' \ +'$1' | $(SORT) | $(UNIQ) +endef + +# $(call get-missing-inputs,<log file>,<target files>) +define get-missing-inputs +$(SED) \ +-e '$${' \ +-e ' /^$$/!{' \ +-e ' H' \ +-e ' s/.*//' \ +-e ' }' \ +-e '}' \ +-e '/^$$/!{' \ +-e ' H' \ +-e ' d' \ +-e '}' \ +-e '/^$$/{' \ +-e ' x' \ +-e ' s/^\(\n\)\(.*\)/\2\1/' \ +-e '}' \ +-e '/^::P\(P\{1,\}\)::/{' \ +-e ' s//::\1::/' \ +-e ' G' \ +-e ' h' \ +-e ' d' \ +-e '}' \ +-e '/^::P::/{' \ +-e ' s//::0::/' \ +-e ' G' \ +-e '}' \ +-e 'b start' \ +-e ':needonemore' \ +-e 's/^/::P::/' \ +-e 'G' \ +-e 'h' \ +-e 'd' \ +-e ':needtwomore' \ +-e 's/^/::PP::/' \ +-e 'G' \ +-e 'h' \ +-e 'd' \ +-e ':needthreemore' \ +-e 's/^/::PPP::/' \ +-e 'G' \ +-e 'h' \ +-e 'd' \ +-e ':start' \ +-e '/^! LaTeX Error: File `/{' \ +-e ' b needtwomore' \ +-e '}' \ +-e '/^::0::\(.*\)/{' \ +-e ' s//\1/' \ +-e ' /Default extension: /!d' \ +-e ' s/.*File `\([^'"'"']*\)'"'"' not found.*/\1/' \ +-e ' s/[[:cntrl:]]//' \ +-e ' /\.tex/!s/$$/.tex/' \ +-e ' s/[[:space:]]/\\ /g' \ +-e ' h' \ +-e ' s/.*/# MISSING input "&" - (presence of comment affects build)/' \ +-e ' p' \ +-e ' s/.*//' \ +-e ' x' \ +-e ' s!^.*!$2: $$(call path-norm,&)!' \ +-e ' p' \ +-e '}' \ +-e 'd' \ +'$1' | $(SORT) | $(UNIQ) +endef + +# Get source file for specified graphics stem. +# +# $(call graphics-source,<stem>) +define graphics-source +$(strip $(firstword \ + $(wildcard \ + $(addprefix $1.,\ + $(graphic_source_extensions))) \ + $1 \ +)) +endef + +# Get the target file for the specified graphics file/stem +# +# $(call graphics-target,<stem>) +define graphics-target +$(strip $(if $(filter $(addprefix %.,$(graphic_target_extensions)),$1), $1, + $(firstword $(patsubst $(addprefix %.,$(graphic_source_extensions) $(graphic_target_extensions)), %, $1).$(default_graphic_extension) $1.$(default_graphic_extension)))) +endef + +# Outputs all of the graphical dependencies to stdout. The first argument is +# the stem of the source file being built, the second is a list of suffixes +# that will show up as dependencies in the generated .d file. +# +# Note that we try to escape spaces in filenames where possible. We have to do +# it with three backslashes so that as the name percolates through the makefile +# it eventually ends up with the proper escaping when the build rule is found. +# Ugly, but it appears to work. Note that graphicx doesn't allow filenames +# with spaces, so this could in many ways be moot unless you're using something +# like grffile. +# +# For pdflatex, we really need the missing file to be specified without an +# extension, otherwise compilation barfs on the first missing file. Truly +# annoying, but there you have it. +# +# It turns out that the graphics errors, although they have lines with empty +# space, are only made of two paragraphs. So, we just use some sed magic to +# get everything into paragraphs, detect when it's a paragraph that interests +# us, and double it up. Then we get the filename only if we're missing +# extensions (a sign that it's graphicx complaining). +# +# $(call get-graphics,<target file stem>) +#.log,$(addprefix $*.,d $(build_target_extension) _graphics) +define get-graphics +$(SED) \ +-e '/^File: \(.*\) Graphic file (type [^)]*)/{' \ +-e ' s//\1/' \ +-e ' b addtargets' \ +-e '}' \ +-e '$${' \ +-e ' /^$$/!{' \ +-e ' H' \ +-e ' s/.*//' \ +-e ' }' \ +-e '}' \ +-e '/^$$/!{' \ +-e ' H' \ +-e ' d' \ +-e '}' \ +-e '/^$$/{' \ +-e ' x' \ +-e ' s/^\(\n\)\(.*\)/\2\1/' \ +-e '}' \ +-e '/^::P\(P\{1,\}\)::/{' \ +-e ' s//::\1::/' \ +-e ' G' \ +-e ' h' \ +-e ' d' \ +-e '}' \ +-e '/^::P::/{' \ +-e ' s//::0::/' \ +-e ' G' \ +-e '}' \ +-e 'b start' \ +-e ':needonemore' \ +-e 's/^/::P::/' \ +-e 'G' \ +-e 'h' \ +-e 'd' \ +-e ':needtwomore' \ +-e 's/^/::PP::/' \ +-e 'G' \ +-e 'h' \ +-e 'd' \ +-e ':needthreemore' \ +-e 's/^/::PPP::/' \ +-e 'G' \ +-e 'h' \ +-e 'd' \ +-e ':start' \ +-e '/^[^[:cntrl:]:]*:[[:digit:]]\{1,\}: LaTeX Error: File `/{' \ +-e ' s/\n//g' \ +-e ' b needonemore' \ +-e '}' \ +-e '/^::0::.*: LaTeX Error: File `/{' \ +-e ' /\n\n$$/{' \ +-e ' s/^::0:://' \ +-e ' b needonemore' \ +-e ' }' \ +-e ' s/\n\{1,\}/ /g' \ +-e ' s/[[:space:]]\{1,\}/ /g' \ +-e ' s/^.*File `//' \ +-e ' s/'"'"' not found\..*extensions: \([^[:space:]]*\).*/::::\1/' \ +-e ' h' \ +-e ' s/\(.*\)::::\(.*\)/# MISSING stem "\1" - allowed extensions are "\2" - leave comment here - it affects the build/' \ +-e ' p' \ +-e ' g' \ +-e ' s/::::.*//' \ +-e ' b addtargets' \ +-e '}' \ +-e 'd' \ +-e ':addtargets' \ +-e 's/[[:space:]]/\\\\\\&/g' \ +-e 'h' \ +-e 's/.*/-include &.gpi.d/' \ +-e 'p' \ +-e 'g' \ +-e 's!.*!$1.d: $$$$(call graphics-source,&)!' \ +-e 'p' \ +-e 's/.*//' \ +-e 'x' \ +-e 's!.*!$1.$(build_target_extension) $1._graphics: $$$$(call graphics-target,&)!' \ +-e 'p' \ +-e 'd' \ +$1.log +endef + +# Checks for build failure due to pstex inclusion, and gives instructions. +# +# $(call die-on-pstexs,<parsed file>) +define die-on-pstexs +if $(EGREP) -q '^! LaTeX Error: File .*\.pstex.* not found' $1; then \ + $(ECHO) "$(C_ERROR)Missing pstex_t file(s)$(C_RESET)"; \ + $(ECHO) "$(C_ERROR)Please run$(C_RESET)"; \ + $(ECHO) "$(C_ERROR) make all-pstex$(C_RESET)"; \ + $(ECHO) "$(C_ERROR)before proceeding.$(C_RESET)"; \ + exit 1; \ +fi +endef + +# Checks for the use of import.sty and bails - we don't support subdirectories +# +# $(call die-on-import-sty,<log file>) +define die-on-import-sty +if $(EGREP) -s '/import.sty\)' '$1'; then \ + $(ECHO) "$(C_ERROR)import.sty is not supported - included files must"; \ + $(ECHO) "$(C_ERROR)be in the same directory as the primary document$(C_RESET)"; \ + exit 1; \ +fi +endef + +# Checks for build failure due to dot2tex, and gives instructions. +# +# $(call die-on-dot2tex,<parsed file>) +define die-on-dot2tex +if $(EGREP) -q ' LaTeX Error: File .*\.dot_t.* not found' $1; then \ + $(ECHO) "$(C_ERROR)Missing dot_t file(s)$(C_RESET)"; \ + $(ECHO) "$(C_ERROR)Please run$(C_RESET)"; \ + $(ECHO) "$(C_ERROR) make all-dot2tex$(C_RESET)"; \ + $(ECHO) "$(C_ERROR)before proceeding.$(C_RESET)"; \ + exit 1; \ +fi +endef + +# Checks for the existence of a .aux file, and dies with an error message if it +# isn't there. Note that we pass the file stem in, not the full filename, +# e.g., to check for foo.aux, we call it thus: $(call die-on-no-aux,foo) +# +# $(call die-on-no-aux,<aux stem>) +define die-on-no-aux +if [ ! -e '$1.aux' ]; then \ + $(call colorize-latex-errors,$1.log); \ + $(ECHO) "$(C_ERROR)Error: failed to create $1.aux$(C_RESET)"; \ + exit 1; \ +fi +endef + +# Outputs all index files to stdout. Arg 1 is the source file stem, arg 2 is +# the list of targets for the discovered dependency. +# +# $(call get-log-index,<log file stem>,<target files>) +define get-log-index +$(SED) \ +-e 's/^No file \(.*\.ind\)\.$$/TARGETS=\1/' \ +-e 's/^No file \(.*\.[gn]ls\)\.$$/TARGETS=\1/' \ +-e 's/[[:space:]]/\\&/g' \ +-e '/^TARGETS=/{' \ +-e ' h' \ +-e ' s!^TARGETS=!$2: !p' \ +-e ' g' \ +-e ' s!^TARGETS=\(.*\)!\1: $1.tex!p' \ +-e '}' \ +-e 'd' \ +'$1.log' | $(SORT) | $(UNIQ) +endef + + +# Outputs all bibliography files to stdout. Arg 1 is the source stem, arg 2 is +# a list of targets for each dependency found. +# +# The script kills all lines that do not contain bibdata. Remaining lines have +# the \bibdata macro and delimiters removed to create a dependency list. A +# trailing comma is added, then all adjacent commas are collapsed into a single +# comma. Then commas are replaced with the string .bib[space], and the +# trailing space is killed off. Finally, all filename spaces are escaped. +# This produces a list of space-delimited .bib filenames, which is what the +# make dep file expects to see. +# +# Note that we give kpsewhich a bogus argument so that a failure of sed to +# produce output will not cause an error. +# +# $(call get-bibs,<aux file>,<targets>) +define get-bibs +$(SED) \ +-e '/^\\bibdata/!d' \ +-e 's/\\bibdata{\([^}]*\)}/\1,/' \ +-e 's/,\{2,\}/,/g' \ +-e 's/[[:space:]]/\\&/g' \ +-e 's/,/.bib /g' \ +-e 's/ \{1,\}$$//' \ +$1 | $(XARGS) $(KPSEWHICH) '#######' | \ +$(SED) \ +-e 's!^!$2: !' | \ +$(SORT) | $(UNIQ) +endef + +# Makes a an aux file that only has stuff relevant to the target in it +# $(call make-auxtarget-file,<flattened-aux>,<new-aux>) +define make-auxtarget-file +$(SED) \ +-e '/^\\newlabel/!d' \ +$1 > $2 +endef + +# Makes an aux file that only has stuff relevant to the bbl in it +# $(call make-auxbbl-file,<flattened-aux>,<new-aux>) +define make-auxbbl-file +$(SED) \ +-e '/^\\newlabel/d' \ +$1 > $2 +endef + +# Makes a .gpi.d file from a .gpi file +# $(call make-gpi-d,<.gpi>,<.gpi.d>) +define make-gpi-d +$(ECHO) '# vim: ft=make' > $2; \ +$(ECHO) 'ifndef INCLUDED_$(call cleanse-filename,$2)' >> $2; \ +$(ECHO) 'INCLUDED_$(call cleanse-filename,$2) := 1' >> $2; \ +$(call get-gpi-deps,$1,$(addprefix $(2:%.gpi.d=%).,$(GPI_OUTPUT_EXTENSION) gpi.d)) >> $2; \ +$(ECHO) 'endif' >> $2; +endef + +# Parse .gpi files for data and loaded dependencies, output to stdout +# +# The sed script here tries to be clever about obtaining valid +# filenames from the gpi file. It assumes that the plot command starts its own +# line, which is not too difficult a constraint to satisfy. +# +# This command script also generates 'include' directives for every 'load' +# command in the .gpi file. The load command must appear on a line by itself +# and the file it loads must have the suffix .gpi. If you don't want it to be +# compiled when running make graphics, then give it a suffix of ._include_.gpi. +# +# $(call get-gpi-deps,<gpi file>,<targets>) +define get-gpi-deps +$(SED) \ +-e '/^[[:space:]]*s\{0,1\}plot/,/[^\\]$$/{' \ +-e ' H' \ +-e ' /[^\\]$$/{' \ +-e ' s/.*//' \ +-e ' x' \ +-e ' s/\\\{0,1\}\n//g' \ +-e ' s/^[[:space:]]*s\{0,1\}plot[[:space:]]*\(\[[^]]*\][[:space:]]*\)*/,/' \ +-e ' s/[[:space:]]*\(['"'"'\'"'"''"'"'"][^'"'"'\'"'"''"'"'"]*['"'"'\'"'"''"'"'"]\)\{0,1\}[^,]*/\1/g' \ +-e ' s/,['"'"'\'"'"''"'"'"]-\{0,1\}['"'"'\'"'"''"'"'"]//g' \ +-e ' s/[,'"'"'\'"'"''"'"'"]\{1,\}/ /g' \ +-e ' s/.*:.*/$$(error Error: Filenames with colons are not allowed: &)/' \ +-e ' s!.*!$2: &!' \ +-e ' p' \ +-e ' }' \ +-e ' d' \ +-e '}' \ +-e 's/^[[:space:]]*load[[:space:]]*['"'"'\'"'"''"'"'"]\([^'"'"'\'"'"''"'"'"]*\.gpi\)['"'"'\'"'"''"'"'"].*$$/-include \1.d/p' \ +-e 'd' \ +'$1' +endef + +# Colorizes real, honest-to-goodness LaTeX errors that can't be overcome with +# recompilation. +# +# Note that we only ignore file not found errors for things that we know how to +# build, like graphics files. +# +# Also note that the output of this is piped through sed again to escape any +# backslashes that might have made it through. This is to avoid sending things +# like "\right" to echo, which interprets \r as LF. In bash, we could just do +# ${var//\\/\\\\}, but in other popular sh variants (like dash), this doesn't +# work. +# +# $(call colorize-latex-errors,<log file>) +define colorize-latex-errors +$(SED) \ +-e '$${' \ +-e ' /^$$/!{' \ +-e ' H' \ +-e ' s/.*//' \ +-e ' }' \ +-e '}' \ +-e '/^$$/!{' \ +-e ' H' \ +-e ' d' \ +-e '}' \ +-e '/^$$/{' \ +-e ' x' \ +-e ' s/^\(\n\)\(.*\)/\2\1/' \ +-e '}' \ +-e '/^::P\(P\{1,\}\)::/{' \ +-e ' s//::\1::/' \ +-e ' G' \ +-e ' h' \ +-e ' d' \ +-e '}' \ +-e '/^::P::/{' \ +-e ' s//::0::/' \ +-e ' G' \ +-e '}' \ +-e 'b start' \ +-e ':needonemore' \ +-e 's/^/::P::/' \ +-e 'G' \ +-e 'h' \ +-e 'd' \ +-e ':needtwomore' \ +-e 's/^/::PP::/' \ +-e 'G' \ +-e 'h' \ +-e 'd' \ +-e ':needthreemore' \ +-e 's/^/::PPP::/' \ +-e 'G' \ +-e 'h' \ +-e 'd' \ +-e ':start' \ +-e '/^! LaTeX Error: File /{' \ +-e ' s/\n//g' \ +-e ' b needtwomore' \ +-e '}' \ +-e 's/^[^[:cntrl:]:]*:[[:digit:]]\{1,\}:/!!! &/' \ +-e 's/^\(.*\n\)\([^[:cntrl:]:]*:[[:digit:]]\{1,\}: .*\)/\1!!! \2/' \ +-e '/^!!! .* LaTeX Error: File /{' \ +-e ' s/\n//g' \ +-e ' b needonemore' \ +-e '}' \ +-e '/^::0::! LaTeX Error: File .*/{' \ +-e ' /\n\n$$/{' \ +-e ' s/^::0:://' \ +-e ' b needonemore' \ +-e ' }' \ +-e ' s/^::0::! //' \ +-e ' s/^\(.*not found.\).*Enter file name:.*\n\(.*[[:digit:]]\{1,\}\): Emergency stop.*/\2: \1/' \ +-e ' b error' \ +-e '}' \ +-e '/^::0::!!! .*LaTeX Error: File .*/{' \ +-e ' /\n\n$$/{' \ +-e ' s/^::0:://' \ +-e ' b needonemore' \ +-e ' }' \ +-e ' s/::0::!!! //' \ +-e ' /could not locate.*any of these extensions:/{' \ +-e ' d' \ +-e ' }' \ +-e ' s/\(not found\.\).*/\1/' \ +-e ' b error' \ +-e '}' \ +-e '/^\(.* LaTeX Error: Missing .begin.document.\.\).*/{' \ +-e ' s//\1 --- Are you trying to build an include file?/' \ +-e ' b error' \ +-e '}' \ +-e '/.*\(!!! .*Undefined control sequence\)[^[:cntrl:]]*\(.*\)/{' \ +-e ' s//\1: \2/' \ +-e ' s/\nl\.[[:digit:]][^[:cntrl:]]*\(\\[^\\[:cntrl:]]*\).*/\1/' \ +-e ' b error' \ +-e '}' \ +-e '/^\(!pdfTeX error:.*\)s*/{' \ +-e ' b error' \ +-e '}' \ +-e '/.*\(!!! .*\)/{' \ +-e ' s//\1/' \ +-e ' s/[[:cntrl:]]//' \ +-e ' s/[[:cntrl:]]$$//' \ +-e ' b error' \ +-e '}' \ +-e 'd' \ +-e ':error' \ +-e 's/^!\(!! \)\{0,1\}\(.*\)/$(C_ERROR)\2$(C_RESET)/' \ +-e 'p' \ +-e 'd' \ +'$1' | $(SED) -e 's/\\\\/\\\\\\\\/g' +endef + +# Colorize Makeindex errors +define colorize-makeindex-errors +$(SED) \ +-e '/^!! /{' \ +-e ' N' \ +-e ' s/^.*$$/$(C_ERROR)&$(C_RESET)/' \ +-e ' p' \ +-e '}' \ +-e 'd' \ +'$1' +endef + +# Colorize xindy errors +# $(call colorize-xindy-errors,<log file>) +define colorize-xindy-errors +$(SED) \ +-e 's/^xindy:.*/$(C_ERROR)&$(C_RESET)/p' \ +-e 'd' \ +'$1' +endef + +# Colorize epstopdf errors +# +# $(call colorize-epstopdf-errors,<log file>) +define colorize-epstopdf-errors +$(SED) \ +-e '/^Error:/,/^Execution stack:/{' \ +-e ' /^Execution stack:/d' \ +-e ' s/.*/$(C_ERROR)&$(C_RESET)/' \ +-e ' p' \ +-e '}' \ +-e 'd' \ +'$1' +endef + +# Colorize GNUplot errors +# +# $(call colorize-gnuplot-errors,<log file>) +define colorize-gnuplot-errors +$(SED) \ +-e '/, line [0-9]*:/!{' \ +-e ' H' \ +-e ' x' \ +-e ' s/.*\n\(.*\n.*\)$$/\1/' \ +-e ' x' \ +-e '}' \ +-e '/, line [0-9]*:/{' \ +-e ' H' \ +-e ' /unknown.*terminal type/{' \ +-e ' s/.*/--- Try changing the GNUPLOT_OUTPUT_EXTENSION variable to '"'"'eps'"'"'./' \ +-e ' H' \ +-e ' }' \ +-e ' /gpihead/{' \ +-e ' s/.*/--- This could be a Makefile bug - contact the maintainer./' \ +-e ' H' \ +-e ' }' \ +-e ' g' \ +-e ' s/.*/$(C_ERROR)&$(C_RESET)/' \ +-e ' p' \ +-e '}' \ +-e '/^gnuplot>/,/^$$/{' \ +-e ' s/^gnuplot.*/$(C_ERROR)&/' \ +-e ' s/^$$/$(C_RESET)/' \ +-e ' p' \ +-e '}' \ +-e 'd' \ +$1 +endef + +# Colorize GraphViz errors +# +# $(call colorize-dot-errors,<log file>) +define colorize-dot-errors +$(SED) \ +-e 's/.*not found.*/$(C_ERROR)&$(C_RESET)/p' \ +-e '/^Error:/,/context:/s/.*/$(C_ERROR)&$(C_RESET)/p' \ +-e 's/^Warning:.*/$(C_WARNING)&$(C_RESET)/p' \ +-e 'd' \ +'$1' +endef + +# Get all important .aux files from the top-level .aux file and merges them all +# into a single file, which it outputs to stdout. +# +# $(call flatten-aux,<toplevel aux>,<output file>) +define flatten-aux +$(SED) \ +-e '/\\@input{\(.*\)}/{' \ +-e 's//\1/' \ +-e 's![.:]!\\&!g' \ +-e 'h' \ +-e 's!.*!\\:\\\\@input{&}:{!' \ +-e 'p' \ +-e 'x' \ +-e 's/\\././g' \ +-e 's/.*/r &/p' \ +-e 's/.*/d/p' \ +-e 's/.*/}/p' \ +-e 'd' \ +-e '}' \ +-e 'd' \ +'$1' > "$1.$$$$.sed.make"; \ +$(SED) -f "$1.$$$$.sed.make" '$1' > "$1.$$$$.make"; \ +$(SED) \ +-e '/^\\relax/d' \ +-e '/^\\bibcite/d' \ +-e 's/^\(\\newlabel{[^}]\{1,\}}\).*/\1/' \ +"$1.$$$$.make" | $(SORT) > '$2'; \ +$(call remove-temporary-files,$1.$$$$.make $1.$$$$.sed.make) +endef + +# Generate pdf from postscript +# +# Note that we don't just call ps2pdf, since there are so many versions of that +# script on various systems. Instead, we call the postscript interpreter +# directly. +# +# $(call ps2pdf,infile,outfile,[embed fonts]) +define ps2pdf + $(GS) \ + -dSAFER -dCompatibilityLevel=$(PS_COMPATIBILITY) \ + $(if $3,$(PS_EMBED_OPTIONS)) \ + -q -dNOPAUSE -dBATCH \ + -sDEVICE=pdfwrite -sstdout=%stderr \ + '-sOutputFile=$2' \ + -dSAFER -dCompatibilityLevel=$(PS_COMPATIBILITY) \ + $(if $3,$(PS_EMBED_OPTIONS)) \ + -c .setpdfwrite \ + -f '$1' +endef + +# Colorize LaTeX output. +color_tex := \ +$(SED) \ +-e '$${' \ +-e ' /^$$/!{' \ +-e ' H' \ +-e ' s/.*//' \ +-e ' }' \ +-e '}' \ +-e '/^$$/!{' \ +-e ' H' \ +-e ' d' \ +-e '}' \ +-e '/^$$/{' \ +-e ' x' \ +-e ' s/^\n//' \ +-e ' /Output written on /{' \ +-e ' s/.*Output written on \([^(]*\) (\([^)]\{1,\}\)).*/Success! Wrote \2 to \1/' \ +-e ' s/[[:digit:]]\{1,\}/$(C_PAGES)&$(C_RESET)/g' \ +-e ' s/Success!/$(C_SUCCESS)&$(C_RESET)/g' \ +-e ' s/to \(.*\)$$/to $(C_SUCCESS)\1$(C_RESET)/' \ +-e ' b end' \ +-e ' }' \ +-e ' / *LaTeX Error:.*/{' \ +-e ' s/.*\( *LaTeX Error:.*\)/$(C_ERROR)\1$(C_RESET)/' \ +-e ' b end' \ +-e ' }' \ +-e ' /.*Warning:.*/{' \ +-e ' s//$(C_WARNING)&$(C_RESET)/' \ +-e ' b end' \ +-e ' }' \ +-e ' /Underfull.*/{' \ +-e ' s/.*\(Underfull.*\)/$(C_UNDERFULL)\1$(C_RESET)/' \ +-e ' b end' \ +-e ' }' \ +-e ' /Overfull.*/{' \ +-e ' s/.*\(Overfull.*\)/$(C_OVERFULL)\1$(C_RESET)/' \ +-e ' b end' \ +-e ' }' \ +-e ' d' \ +-e ' :end' \ +-e ' G' \ +-e '}' + +# Colorize BibTeX output. +color_bib := \ +$(SED) \ +-e 's/^Warning--.*/$(C_WARNING)&$(C_RESET)/' \ +-e 't' \ +-e '/---/,/^.[^:]/{' \ +-e ' H' \ +-e ' /^.[^:]/{' \ +-e ' x' \ +-e ' s/\n\(.*\)/$(C_ERROR)\1$(C_RESET)/' \ +-e ' p' \ +-e ' s/.*//' \ +-e ' h' \ +-e ' d' \ +-e ' }' \ +-e ' d' \ +-e '}' \ +-e '/(.*error.*)/s//$(C_ERROR)&$(C_RESET)/' \ +-e 'd' + +# Make beamer output big enough to print on a full page. Landscape doesn't +# seem to work correctly. +enlarge_beamer = $(PSNUP) -l -1 -W128mm -H96mm -pletter + +# $(call test-run-again,<source stem>) +test-run-again = $(EGREP) -q '^(.*Rerun .*|No file $1\.[^.]+\.)$$' $1.log + +# This tests whether the build target commands should be run at all, from +# viewing the log file. +# $(call test-log-for-need-to-run,<source stem>) +define test-log-for-need-to-run +$(SED) \ +-e '/^No file $(call escape-fname-regex,$1)\.aux\./d' \ +$1.log \ +| $(EGREP) -q '^(.*Rerun .*|No file $1\.[^.]+\.|No file .+\.tex\.|LaTeX Warning: File.*)$$' +endef + +# LaTeX invocations +# +# $(call latex,<tex file>,[<extra LaTeX args>]) +run-latex = $(latex_build_program) -interaction=batchmode -file-line-error $(if $2,$2,) $1 > /dev/null + +# $(call latex-color-log,<LaTeX stem>) +latex-color-log = $(color_tex) $1.log + +# $(call run-makeindex,<input>,<output>,<log>,[.ist style file]) +define run-makeindex +success=1; \ +if ! $(MAKEINDEX) -q $1 -t $3 -o $2 $(if $4,-s $4,) > /dev/null || $(EGREP) -q '^!!' $3; \ +then \ + $(call colorize-makeindex-errors,$3); \ + $(RM) -f '$2'; \ + success=0; \ +fi; \ +[ "$$success" = "1" ] && $(sh_true) || $(sh_false); +endef + + +# $(call run-xindy,<input>,<output>,<module>,<log>) +define run-xindy +success=1; \ +if ! $(XINDY) -q -o $2 -L $(XINDYLANG) -C $(XINDYENC) -I xindy -M $3 -t $4 $1 > /dev/null || $(EGREP) -q '^xindy:' $4; then \ + $(call colorize-xindy-errors,$4); \ + $(RM) -f '$2'; \ + success=0; \ +fi; \ +[ "$$success" = "1" ] && $(sh_true) || $(sh_false); +endef + +# This runs the given script to generate output, and it uses MAKE_RESTARTS to +# ensure that it never runs it more than once for a particular root make +# invocation. +# +# $(call run-script,<interpreter>,<input>,<output>) +define run-script +[ ! -e '$2.cookie' ] && $(ECHO) "restarts=$(RESTARTS)" > $2.cookie && $(ECHO) "level=$(MAKELEVEL)" >> $2.cookie; \ +restarts=`$(SED) -n -e 's/^restarts=//p' $2.cookie`; \ +level=`$(SED) -n -e 's/^level=//p' $2.cookie`; \ +if $(EXPR) $(MAKELEVEL) '<=' $$level '&' $(RESTARTS) '<=' $$restarts >/dev/null; then \ + $(call echo-build,$2,$3,$(RESTARTS)-$(MAKELEVEL)); \ + $1 '$2' '$3'; \ + $(ECHO) "restarts=$(RESTARTS)" > '$2.cookie'; \ + $(ECHO) "level=$(MAKELEVEL)" >> '$2.cookie'; \ +fi +endef + +# BibTeX invocations +# +# $(call run-bibtex,<tex stem>) +run-bibtex = $(BIBTEX) $1 | $(color_bib) + + +# $(call convert-eps-to-pdf,<eps file>,<pdf file>,[gray]) +# Note that we don't use the --filter flag because it has trouble with bounding boxes that way. +define convert-eps-to-pdf +$(if $3,$(CAT) '$1' | $(call kill-ps-color) > '$1.cookie',$(CP) '$1' '$1.cookie'); \ +$(EPSTOPDF) '$1.cookie' --outfile='$2' > $1.log; \ +$(call colorize-epstopdf-errors,$1.log); +endef + +# $(call default-gpi-fontsize,<output file>) +# +# Find the default fontsize given the *output* file (it is based on the output extension) +# +default-gpi-fontsize = $(if $(filter %.pdf,$1),$(DEFAULT_GPI_PDF_FONTSIZE),$(DEFAULT_GPI_EPS_FONTSIZE)) + +# $(call gpi-fontsize,<gpi file>,<output file>) +# +# Find out what the gnuplot fontsize should be. Tries, in this order: +# - ##FONTSIZE comment in gpi file +# - ##FONTSIZE comment in global gpi file +# - default fontsize based on output type +define gpi-fontsize +$(strip $(firstword \ + $(shell $(SED) -e 's/^\#\#FONTSIZE=\([[:digit:]]\{1,\}\)/\1/p' -e 'd' $1 $(strip $(gpi_global))) \ + $(call default-gpi-fontsize,$2))) +endef + +# $(call gpi-monochrome,<gpi file>,[gray]) +define gpi-monochrome +$(strip $(if $2,monochrome,$(if $(shell $(EGREP) '^\#\#[[:space:]]*GRAY[[:space:]]*$$' $1 $(gpi_global)),monochrome,color))) +endef + +# $(call gpi-font-entry,<output file>,<fontsize>) +# +# Get the font entry given the output file (type) and the font size. For PDF +# it uses fsize or font, for eps it just uses the bare number. +gpi-font-entry = $(if $(filter %.pdf,$1),$(subst FONTSIZE,$2,$(GPI_FSIZE_SYNTAX)),$2) + +# $(call gpi-terminal,<gpi file><output file>,[gray]) +# +# Get the terminal settings for a given gpi and its intended output file +define gpi-terminal +$(if $(filter %.pdf,$2),pdf enhanced,postscript enhanced eps) \ +$(call gpi-font-entry,$2,$(call gpi-fontsize,$1,$2)) \ +$(call gpi-monochrome,$1,$3) +endef + +# $(call gpi-embed-pdf-fonts,<input file>,<output file>) +# +define gpi-embed-pdf-fonts +$(GS) \ + -q \ + -dSAFER \ + -dNOPAUSE \ + -dBATCH \ + -sDEVICE=$(if $(filter pdf,$(GPI_OUTPUT_EXTENSION)),pdfwrite,pswrite) \ + -sOutputFile='$2' \ + -sstdout=%stderr \ + -dCompatibilityLevel=1.5 \ + -dPDFSETTINGS=/prepress \ + -c .setpdfwrite \ + -f '$1' +endef + +# $(call convert-gpi,<gpi file>,<output file>,[gray]) +# +define convert-gpi +$(ECHO) 'set terminal $(call gpi-terminal,$1,$2,$3)' > $1head.make; \ +$(ECHO) 'set output "$2"' >> $1head.make; \ +$(if $(gpi_global),$(CAT) $(gpi_global) >> $1head.make;,) \ +fnames='$1head.make $1';\ +$(if $(gpi_sed),\ + $(SED) -f '$(gpi_sed)' $$fnames > $1.temp.make; \ + fnames=$1.temp.make;,\ +) \ +success=1; \ +if ! $(GNUPLOT) $$fnames 2>$1.log; then \ + $(call colorize-gnuplot-errors,$1.log); \ + success=0; \ +else \ + if ! $(call gpi-embed-pdf-fonts,$2,$2.embed.make); then \ + success = 0; \ + else \ + $(call move-if-exists,$2.embed.make,$2); \ + fi; \ +fi; \ +$(if $(gpi_sed),$(call remove-temporary-files,$1.temp.make);,) \ +$(call remove-temporary-files,$1head.make); \ +[ "$$success" = "1" ] && $(sh_true) || $(sh_false); +endef + +# Creation of .eps files from .png files +# +# The intermediate step of PNM (using NetPBM) produces much nicer output than +# ImageMagick's "convert" binary. I couldn't get the right combination of +# flags to make it look nice, anyway. +# +# To handle gray scale conversion, we pipe things through ppmtopgm in the +# middle. +# +# $(call convert-png,<png file>,<eps file>) +define convert-png +$(PNGTOPNM) "$1" \ + $(if $3,| $(PPMTOPGM),) \ + | $(PNMTOPS) -noturn \ + > "$2" +endef + +# Creation of .eps files from .jpg/.jpeg files +# +# Thanks to brubakee for this solution. +# +# Uses Postscript level 2 to avoid file size bloat +# $(call convert-jpg,<jpg file>,<eps file>) +define convert-jpg +$(CONVERT) $(if $3,-type Grayscale,) '$1' eps2:'$2' +endef + +# Creation of .eps files from .fig files +# $(call convert-fig,<fig file>,<output file>,[gray]) +convert-fig = $(FIG2DEV) -L $(if $(filter %.pdf,$2),pdf,eps) $(if $3,-N,) $1 $2 + +# Creation of .pstex files from .fig files +# $(call convert-fig-pstex,<fig file>,<pstex file>) +convert-fig-pstex = $(FIG2DEV) -L pstex $1 $2 > /dev/null 2>&1 + +# Creation of .pstex_t files from .fig files +# $(call convert-fig-pstex-t,<fig file>,<pstex file>,<pstex_t file>) +convert-fig-pstex-t = $(FIG2DEV) -L pstex_t -p $3 $1 $2 > /dev/null 2>&1 + +# Creation of .dot_t files from .dot files +# #(call convert-dot-tex,<dot file>,<dot_t file>) +convert-dot-tex = $(DOT2TEX) '$1' > '$2' + +# Converts svg files into .eps files +# +# $(call convert-svg,<svg file>,<eps/pdf file>,[gray]) +convert-svg = $(INKSCAPE) --without-gui $(if $(filter %.pdf,$2),--export-pdf,--export-eps)='$2' '$1' + +# Converts xvg files into .eps files +# +# $(call convert-xvg,<xvg file>,<eps file>,[gray]) +convert-xvg = $(XMGRACE) '$1' -printfile - -hardcopy -hdevice $(if $3,-mono,) EPS > '$2' + +# Converts .eps.gz files into .eps files +# +# $(call convert-epsgz,<eps.gz file>,<eps file>,[gray]) +convert-epsgz = $(GUNZIP) -c '$1' $(if $3,| $(call kill-ps-color)) > '$2' + +# Converts .eps files into .eps files (usually a no-op, but can make grayscale) +# +# $(call convert-eps,<in file>,<out file>,[gray]) +convert-eps = $(if $3,$(call kill-ps-color) $1 > $2) + +# The name of the file containing special postscript commands for grayscale +gray_eps_file := gray.eps.make + +# Changes sethsbcolor and setrgbcolor calls in postscript to always produce +# grayscale. In general, this is accomplished by writing new versions of those +# functions into the user dictionary space, which is looked up before the +# global or system dictionaries (userdict is one of the permanent dictionaries +# in postscript and is not read-only like systemdict). +# +# For setrgbcolor, the weighted average of the triple is computed and the +# triple is replaced with three copies of that average before the original +# procedure is called: .299R + .587G + .114B +# +# For sethsbcolor, the color is first converted to RGB, then to grayscale by +# the new setrgbcolor operator as described above. Why is this done? +# Because simply using the value component will tend to make pure colors +# white, a very undesirable thing. Pure blue should not translate to white, +# but to some level of gray. Conversion to RGB does the right thing. It's +# messy, but it works. +# +# From +# http://en.wikipedia.org/wiki/HSV_color_space#Transformation_from_HSV_to_RGB, +# HSB = HSV (Value = Brightness), and the formula used to convert to RGB is +# as follows: +# +# Hi = int(floor(6 * H)) mod 6 +# f = 6 * H - Hi +# p = V(1-S) +# q = V(1-fS) +# t = V(1-(1-f)S) +# if Hi = 0: R G B <-- V t p +# if Hi = 1: R G B <-- q V p +# if Hi = 2: R G B <-- p V t +# if Hi = 3: R G B <-- p q V +# if Hi = 4: R G B <-- t p V +# if Hi = 5: R G B <-- V p q +# +# The messy stack-based implementation is below +# $(call create-gray-eps-file,filename) +define create-gray-eps-file +$(ECHO) -n -e '\ +/OLDRGB /setrgbcolor load def\n\ +/setrgbcolor {\n\ + .114 mul exch\n\ + .587 mul add exch\n\ + .299 mul add\n\ + dup dup\n\ + OLDRGB\n\ +} bind def\n\ +/OLDHSB /sethsbcolor load def\n\ +/sethsbcolor {\n\ + 2 index % H V S H\n\ + 6 mul floor cvi 6 mod % Hi V S H\n\ + 3 index % H Hi V S H\n\ + 6 mul % 6H Hi V S H\n\ + 1 index % Hi 6H Hi V S H\n\ + sub % f Hi V S H\n\ + 2 index 1 % 1 V f Hi V S H\n\ + 4 index % S 1 V f Hi V S H\n\ + sub mul % p f Hi V S H\n\ + 3 index 1 % 1 V p f Hi V S H\n\ + 6 index % S 1 V p f Hi V S H\n\ + 4 index % f S 1 V p f Hi V S H\n\ + mul sub mul % q p f Hi V S H\n\ + 4 index 1 1 % 1 1 V q p f Hi V S H\n\ + 5 index % f 1 1 V q p f Hi V S H\n\ + sub % (1-f) 1 V q p f Hi V S H\n\ + 8 index % S (1-f) 1 V q p f Hi V S H\n\ + mul sub mul % t q p f Hi V S H\n\ + 4 -1 roll pop % t q p Hi V S H\n\ + 7 -2 roll pop pop % t q p Hi V\n\ + 5 -2 roll % Hi V t q p\n\ + dup 0 eq\n\ + {1 index 3 index 6 index}\n\ + {\n\ + dup 1 eq\n\ + {3 index 2 index 6 index}\n\ + {\n\ + dup 2 eq\n\ + {4 index 2 index 4 index}\n\ + {\n\ + dup 3 eq\n\ + {4 index 4 index 3 index}\n\ + {\n\ + dup 4 eq\n\ + {2 index 5 index 3 index}\n\ + {\n\ + dup 5 eq\n\ + {1 index 5 index 5 index}\n\ + {0 0 0}\n\ + ifelse\n\ + }\n\ + ifelse\n\ + }\n\ + ifelse\n\ + }\n\ + ifelse\n\ + }\n\ + ifelse\n\ + }\n\ + ifelse % B G R Hi V t q p\n\ + setrgbcolor\n\ + 5 {pop} repeat\n\ +} bind def\n'\ +> $1 +endef + +# This actually inserts the color-killing code into a postscript file +# $(call kill-ps-color) +define kill-ps-color +$(SED) -e '/%%EndComments/r $(gray_eps_file)' +endef + +# Converts graphviz .dot files into .eps files +# Grayscale is not directly supported by dot, so we pipe it through fig2dev in +# that case. +# $(call convert-dot,<dot file>,<eps file>,<log file>,[gray]) +define convert-dot +$(DOT) -Tps '$1' 2>'$3' $(if $4,| $(call kill-ps-color)) > $2; \ +$(call colorize-dot-errors,$3) +endef + +# Convert DVI to Postscript +# $(call make-ps,<dvi file>,<ps file>,<log file>,[<paper size>]) +make-ps = \ + $(DVIPS) -z -o '$2' $(if $(filter-out BEAMER,$4),-t$(firstword $4),) '$1' \ + $(if $(filter BEAMER,$4),| $(enlarge_beamer)) > $3 2>&1 + +# Convert Postscript to PDF +# $(call make-pdf,<ps file>,<pdf file>,<log file>,<embed file>) +make-pdf = \ + $(call ps2pdf,$1,$2,$(filter 1,$(shell $(CAT) '$4'))) > '$3' 2>&1 + +# Display information about what is being done +# $(call echo-build,<input file>,<output file>,[<run number>]) +echo-build = $(ECHO) "$(C_BUILD)= $1 --> $2$(if $3, ($3),) =$(C_RESET)" +echo-graphic = $(ECHO) "$(C_GRAPHIC)= $1 --> $2 =$(C_RESET)" +echo-dep = $(ECHO) "$(C_DEP)= $1 --> $2 =$(C_RESET)" + +# Display a list of something +# $(call echo-list,<values>) +echo-list = for x in $1; do $(ECHO) "$$x"; done + +# +# DEFAULT TARGET +# + +.PHONY: all +all: $(default_pdf_targets) ; + +.PHONY: all-pdf +all-pdf: $(default_pdf_targets) ; + +ifeq "$(strip $(BUILD_STRATEGY))" "latex" +.PHONY: all-ps +all-ps: $(default_ps_targets) ; + +.PHONY: all-dvi +all-dvi: $(default_dvi_targets) ; +endif + +# +# VIEWING TARGET +# +.PHONY: show +show: all + $(QUIET)for x in $(default_pdf_targets); do \ + [ -e "$$x" ] && $(VIEW_PDF) $$x & \ + done + +# +# INCLUDES +# +source_includes := $(addsuffix .d,$(source_stems_to_include)) +graphic_includes := $(addsuffix .gpi.d,$(graphic_stems_to_include)) + +# Check the version of the makefile +ifneq "" "$(filter 3.79 3.80,$(MAKE_VERSION))" +$(warning $(C_WARNING)Your version of make is too old. Please upgrade.$(C_RESET)) +endif + +# Include only the dependencies used +ifneq "" "$(source_includes)" +include $(source_includes)$(call include-message,$(source_includes)) +endif +ifneq "" "$(graphic_includes)" +include $(graphic_includes)$(call include-message,$(graphic_includes)) +endif + +# +# MAIN TARGETS +# + +# Note that we don't just say %: %.pdf here - this can tend to mess up our +# includes, which detect what kind of file we are asking for. For example, +# asking to build foo.pdf is much different than asking to build foo when +# foo.gpi exists, because we look through all of the goals for *.pdf that +# matches *.gpi, then use that to determine which include files we need to +# build. +# +# Thus, we invoke make recursively with better arugments instead, restarting +# all of the appropriate machinery. +.PHONY: $(default_stems_ss) +$(default_stems_ss): %: %.pdf ; + +# This builds and displays the wanted file. +.PHONY: $(addsuffix ._show,$(stems_ssg)) +$(addsuffix ._show,$(stems_ssg)): %._show: %.pdf + $(QUIET)$(VIEW_PDF) $< & + +ifeq "$(strip $(BUILD_STRATEGY))" "latex" +.SECONDARY: $(all_pdf_targets) +%.pdf: %.ps %.embed.make + $(QUIET)$(call echo-build,$<,$@) + $(QUIET)$(call make-pdf,$<,$@.temp,$@.log,$*.embed.make); \ + if [ x"$$?" = x"0" ]; then \ + $(if $(VERBOSE),$(CAT) $@.log,:); \ + $(RM) -f '$@'; \ + $(MV) '$@.temp' '$@'; \ + $(TOUCH) '$@'; \ + $(call copy-with-logging,$@,$(BINARY_TARGET_DIR)); \ + else \ + $(CAT) $@.log; \ + $(call remove-temporary-files,'$@.temp'); \ + $(sh_false); \ + fi + +.SECONDARY: $(all_ps_targets) +%.ps: %.dvi %.paper.make + $(QUIET)$(call echo-build,$<,$@) + $(QUIET)$(call make-ps,$<,$@.temp,$@.log,\ + $(firstword $(shell $(CAT) $*.paper.make))); \ + if [ x"$$?" = x"0" ]; then \ + $(if $(VERBOSE),$(CAT) $@.log,:); \ + $(RM) -f '$@'; \ + $(MV) '$@.temp' '$@'; \ + $(TOUCH) '$@'; \ + $(call copy-with-logging,$@,$(BINARY_TARGET_DIR)); \ + else \ + $(CAT) $@.log; \ + $(call remove-temporary-files,'$@.temp'); \ + $(sh_false); \ + fi +endif + +# Build the final target (dvi or pdf) file. This is a very tricky rule because +# of the way that latex runs multiple times, needs graphics after the first run +# (or maybe already has them), and relies on bibliographies or indices that may +# not exist. +# +# Check the log for fatal errors. If they exist, colorize and bail. +# +# Create the .auxtarget.cookie file. (Needed for next time if not present) +# +# If any of the following are true, we must rebuild at least one time: +# +# * the .bbl was recently rebuilt +# +# check a cookie, then delete it +# +# * any of several output files was created or changed: +# +# check $*.run.cookie, then delete it +# +# * the .aux file changed in a way that necessitates attention +# +# Note that if the .auxtarget.make file doesn't exist, this means +# that we are doing a clean build, so it doesn't figure into the +# test for running again. +# +# compare against .auxtarget.make +# +# move if different, remove if not +# +# * the .log file has errors or warnings requiring at least one more run +# +# We use a loop over a single item to simplify the process of breaking +# out when we find one of the conditions to be true. +# +# If we do NOT need to run latex here, then we move the $@.1st.make file +# over to $@ because the target file has already been built by the first +# dependency run and is valid. +# +# If we do, we delete that cookie file and do the normal multiple-runs +# routine. +# +ifeq "$(strip $(BUILD_STRATEGY))" "latex" +.SECONDARY: $(all_dvi_targets) +endif +%.$(build_target_extension): %.bbl %.aux %.$(build_target_extension).1st.make + $(QUIET)\ + fatal=`$(call colorize-latex-errors,$*.log)`; \ + if [ x"$$fatal" != x"" ]; then \ + $(ECHO) "$$fatal"; \ + exit 1; \ + fi; \ + $(call make-auxtarget-file,$*.aux.make,$*.auxtarget.cookie); \ + run=0; \ + for i in 1; do \ + if $(call test-exists,$*.bbl.cookie); then \ + run=1; \ + break; \ + fi; \ + if $(call test-exists,$*.run.cookie); then \ + run=1; \ + break; \ + fi; \ + if $(call \ + test-exists-and-different,$*.auxtarget.cookie,$*.auxtarget.make);\ + then \ + run=1; \ + break; \ + fi; \ + if $(call test-log-for-need-to-run,$*); then \ + run=1; \ + break; \ + fi; \ + if [ ! -e $*.1st.*.make ]; then \ + run=1; \ + break; \ + fi; \ + done; \ + $(call remove-temporary-files,$*.bbl.cookie $*.run.cookie); \ + $(MV) $*.auxtarget.cookie $*.auxtarget.make; \ + if [ x"$$run" = x"1" ]; then \ + $(call remove-files,$@.1st.make); \ + for i in 2 3 4 5; do \ + $(if $(findstring 3.79,$(MAKE_VERSION)),\ + $(call echo-build,$*.tex,$@,$(RESTARTS)-$$$$i),\ + $(call echo-build,$*.tex,$@,$(RESTARTS)-$$i)\ + ); \ + $(call run-latex,$*); \ + $(CP) '$*.log' '$*.'$(RESTARTS)-$$i'.log'; \ + $(call test-run-again,$*) || break; \ + done; \ + else \ + $(MV) '$@.1st.make' '$@'; \ + fi; \ + $(call copy-with-logging,$@,$(BINARY_TARGET_DIR)); \ + $(call latex-color-log,$*) + +# Build the .bbl file. When dependencies are included, this will (or will +# not!) depend on something.bib, which we detect, acting accordingly. The +# dependency creation also produces the %.auxbbl.make file. BibTeX is a bit +# finicky about what you call the actual files, but we can rest assured that if +# a .auxbbl.make file exists, then the .aux file does, as well. The +# .auxbbl.make file is a cookie indicating whether the .bbl needs to be +# rewritten. It only changes if the .aux file changes in ways relevant to .bbl +# creation. +# +# Note that we do NOT touch the .bbl file if there is no need to +# create/recreate it. We would like to leave existing files alone if they +# don't need to be changed, thus possibly avoiding a rebuild trigger. +%.bbl: %.auxbbl.make + $(QUIET)\ + $(if $(filter %.bib,$^),\ + $(call echo-build,$(filter %.bib,$?) $*.aux,$@); \ + $(call run-bibtex,$*); \ + $(TOUCH) $@.cookie; \ + ) \ + if $(EGREP) -q 'bibstyle.(apacite|apacann|chcagoa|[^}]*annot)' '$*.aux'; then \ + $(call echo-build,** annotated extra latex **,output ignored,$(RESTARTS)-1); \ + $(call run-latex,$*); \ + $(CP) '$*.log' '$*.$(RESTARTS)-annotated.log'; \ + $(if $(filter %.bib,$^),\ + $(call echo-build,** annotated extra bibtex ** $(filter %.bib,$?) $*.aux,$@); \ + $(call run-bibtex,$*); \ + $(TOUCH) $@.cookie; \ + ) \ + $(call echo-build,** annotated extra latex **,output ignored,$(RESTARTS)-2); \ + $(call run-latex,$*); \ + fi + +# Create the index file - note that we do *not* depend on %.tex here, since +# that unnecessarily restricts the kinds of indices that we can build to those +# with exactly the same stem as the source file. Things like splitidx create +# idx files with other names. +# +# Therefore, we add the .tex dependency in the sourcestem.d file in the call to +# get index file dependencies from the logs. +%.ind: %.idx + $(QUIET)$(call echo-build,$<,$@) + $(QUIET)$(call run-makeindex,$<,$@,$*.ilg) + +# Create a glossary file from a .ist file +%.gls: %.glo %.tex %.ist + $(QUIET)$(call echo-build,$<,$@) + $(QUIET)$(call run-makeindex,$<,$@,$*.glg,$*.ist) + +# Create a glossary file from a glossary input formatted for xindy +%.gls: %.glo %.tex %.xdy + $(QUIET)$(call echo-build,$<,$@) + $(QUIET)$(call run-xindy,$<,$@,$*,$*.glg) + +# Create the glossary file from a nomenclature file +%.gls: %.glo %.tex nomencl.ist + $(QUIET)$(call echo-build,$<,$@) + $(QUIET)$(call run-makeindex,$<,$@,$*.glg,nomencl.ist) + +# Create the nomenclature file +%.nls: %.nlo %.tex nomencl.ist + $(QUIET)$(call echo-build,$<,$@) + $(QUIET)$(call run-makeindex,$<,$@,$*.nlg,nomencl.ist) + +# SCRIPTED LaTeX TARGETS +# +# Keep the generated .tex files around for debugging if needed. +.SECONDARY: $(all_tex_targets) + +%.tex:: %.tex.sh + $(QUIET)$(call run-script,$(SHELL),$<,$@) + +%.tex:: %.tex.py + $(QUIET)$(call run-script,$(PYTHON),$<,$@) + +%.tex:: %.tex.pl + $(QUIET)$(call run-script,$(PERL),$<,$@) + +%.tex:: %.rst $(RST_STYLE_FILE) + $(QUIET)\ + $(call run-script,$(RST2LATEX)\ + --documentoptions=letterpaper\ + $(if $(RST_STYLE_FILE),--stylesheet=$(RST_STYLE_FILE),),$<,$@) + +# +# GRAPHICS TARGETS +# +.PHONY: all-graphics +all-graphics: $(all_graphics_targets); + +ifeq "$(strip $(BUILD_STRATEGY))" "latex" +.PHONY: all-pstex +all-pstex: $(all_pstex_targets); +endif + +.PHONY: all-dot2tex +all-dot2tex: $(all_dot2tex_targets); + +.PHONY: show-graphics +show-graphics: all-graphics + $(VIEW_GRAPHICS) $(all_known_graphics) + +$(gray_eps_file): + $(QUIET)$(call echo-build,$^,$@) + $(QUIET)$(call create-gray-eps-file,$@) + +ifeq "$(strip $(BUILD_STRATEGY))" "pdflatex" +%.pdf: %.eps $(if $(GRAY),$(gray_eps_file)) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-eps-to-pdf,$<,$@,$(GRAY)) + +ifeq "$(strip $(GPI_OUTPUT_EXTENSION))" "pdf" +%.pdf: %.gpi %.gpi.d $(gpi_sed) $(gpi_global) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-gpi,$<,$@,$(GRAY)) +endif + +%.pdf: %.fig + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-fig,$<,$@,$(GRAY)) + +%.pdf: %.svg + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-svg,$<,$@,$(GRAY)) +endif + +ifeq "$(strip $(BUILD_STRATEGY))" "xelatex" +%.pdf: %.eps $(if $(GRAY),$(gray_eps_file)) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-eps-to-pdf,$<,$@,$(GRAY)) + +ifeq "$(strip $(GPI_OUTPUT_EXTENSION))" "pdf" +%.pdf: %.gpi %.gpi.d $(gpi_sed) $(gpi_global) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-gpi,$<,$@,$(GRAY)) +endif + +%.pdf: %.fig + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-fig,$<,$@,$(GRAY)) + +endif + + +%.eps: %.gpi %.gpi.d $(gpi_sed) $(gpi_global) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-gpi,$<,$@,$(GRAY)) + +%.eps: %.fig + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-fig,$<,$@,$(GRAY)) + +%.eps: %.dot $(if $(GRAY),$(gray_eps_file)) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-dot,$<,$@,$<.log,$(GRAY)) + +%.eps: %.xvg $(if $(GRAY),$(gray_eps_file)) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-xvg,$<,$@,$(GRAY)) + +ifneq "$(default_graphic_extension)" "pdf" +# We have a perfectly good build rule for svg to pdf, so we eliminate this to +# avoid confusing make (it sometimes chooses to go svg -> eps -> pdf). +%.eps: %.svg $(if $(GRAY),$(gray_eps_file)) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-svg,$<,$@,$(GRAY)) + +# Similarly for these, we don't need eps if we have supported extensions +# already. +%.eps: %.jpg $(if $(GRAY),$(gray_eps_file)) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-jpg,$<,$@,$(GRAY)) + +%.eps: %.jpeg $(if $(GRAY),$(gray_eps_file)) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-jpg,$<,$@,$(GRAY)) + +%.eps: %.png $(if $(GRAY),$(gray_eps_file)) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-png,$<,$@,$(GRAY)) +endif + +%.eps: %.eps.gz $(if $(GRAY),$(gray_eps_file)) + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-epsgz,$<,$@,$(GRAY)) + +%.pstex: %.fig + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-fig-pstex,$<,$@,$(GRAY)) + +%.pstex_t: %.fig %.pstex + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-fig-pstex-t,$<,$@,$*.pstex,$(GRAY)) + +%.dot_t: %.dot + $(QUIET)$(call echo-graphic,$^,$@) + $(QUIET)$(call convert-dot-tex,$<,$@) + +# +# DEPENDENCY-RELATED TARGETS. +# + +# Generate all of the information needed to get dependencies +# As a side effect, this creates a .dvi or .pdf file (depending on the build +# strategy). We need to be sure to remove it if there are errors. Errors can +# take several forms and all of them are found within the log file: +# * There was a LaTeX error +# * A needed file was not found +# * Cross references need adjustment +# +# Behavior: +# This rule is responsible for generating the following: +# %.aux +# %.d +# %.aux.make +# %.(pdf|dvi).1st.make (the .pdf or .dvi output file, moved) +# +# Steps: +# +# Run latex +# Move .pdf or .dvi somewhere else (make no judgements about success) +# Flatten the .aux file into another file +# Add source dependencies +# Add graphic dependencies +# Add bib dependencies +# +# Create cookies for various suffixes that may represent files that +# need to be read by LaTeX in order for it to function properly. +# +# Note that if some of the dependencies are discovered because they turn +# up missing in the log file, we really need the .d file to be reloaded. +# Adding a sleep command helps with this. Otherwise make is extremely +# nondeterministic, sometimes working, sometimes not. +# +# Usually we can force this by simply removing the generated pdf file and +# not creating a .1st.make file.. +# +%.$(build_target_extension).1st.make %.d %.aux %.aux.make %.fls: %.tex + $(QUIET)$(call echo-build,$<,$*.d $*.$(build_target_extension).1st.make,$(RESTARTS)-1) + $(QUIET)\ + $(call run-latex,$<,-recorder) || $(sh_true); \ + $(CP) '$*.log' '$*.$(RESTARTS)-1.log'; \ + $(call die-on-import-sty,$*.log); \ + $(call die-on-dot2tex,$*.log); \ + $(call die-on-no-aux,$*); \ + $(call flatten-aux,$*.aux,$*.aux.make); \ + $(ECHO) "# vim: ft=make" > $*.d; \ + $(ECHO) ".PHONY: $*._graphics" >> $*.d; \ + $(call get-inputs,$*.fls,$(addprefix $*.,aux aux.make d $(build_target_extension))) >> $*.d; \ + $(call get-missing-inputs,$*.log,$(addprefix $*.,aux aux.make d $(build_target_extension))) >> $*.d; \ + $(ECHO) ".SECONDEXPANSION:" >> $*.d; \ + $(call get-graphics,$*) >> $*.d; \ + $(call get-log-index,$*,$(addprefix $*.,aux aux.make)) >> $*.d; \ + $(call get-bibs,$*.aux.make,$(addprefix $*.,bbl aux aux.make)) >> $*.d; \ + $(EGREP) -q "# MISSING" $*.d && $(SLEEP) 1 && $(RM) $*.pdf; \ + $(call move-if-exists,$*.$(build_target_extension),$*.$(build_target_extension).1st.make); \ + for s in toc out lot lof lol nav; do \ + if [ -e "$*.$$s" ]; then \ + if ! $(DIFF) -q $*.$$s $*.$$s.make >/dev/null 2>&1; then \ + $(TOUCH) $*.run.cookie; \ + fi; \ + $(CP) $*.$$s $*.$$s.make; \ + fi; \ + done + +# This is a cookie that is updated if the flattened aux file has changed in a +# way that affects the bibliography generation. +.SECONDARY: $(addsuffix .auxbbl.make,$(stems_ssg)) +%.auxbbl.make: %.aux.make + $(QUIET)\ + $(call make-auxbbl-file,$<,$@.temp); \ + $(call replace-if-different-and-remove,$@.temp,$@) + +# Build a dependency file for .gpi files. These often plot data files that +# also reside in the directory, so if a data file changes, it's nice to know +# about it. This also handles loaded .gpi files, whose filename should have +# _include_. in it. +%.gpi.d: %.gpi + $(QUIET)$(call echo-build,$<,$@) + $(QUIET)$(call make-gpi-d,$<,$@) + +# Store the paper size for this document -- note that if beamer is used we set +# it to the special BEAMER paper size. We only do this, however, if the +# special comment exists, in which case we enlarge the output with psnup. +# +# The paper size is extracted from a documentclass attribute. +%.paper.make: %.tex + $(QUIET)$(SED) \ + -e '/\\documentclass/,/}/{' \ + -e ' s/%.*//' \ + -e ' H' \ + -e ' /}/{' \ + -e ' s/.*//' \ + -e ' x' \ + -e ' /\\documentclass/!d' \ + -e ' s/[\n[:space:]]*//g' \ + -e ' s/\([,{[]\)\([[:alnum:]]\{1,\}\)paper\([],}]\)/\1%-\2-%\3/g' \ + -e ' s/\([,{[]\)\(landscape\)\([],}]\)/\1%-\2-%\3/g' \ + -e ' s/^[^%]*%-//' \ + -e ' s/-%[^%]*$$//' \ + -e ' s/-%[^%]%-/ /g' \ + -e ' p' \ + -e ' }' \ + -e ' d' \ + -e '}' \ + -e 'd' \ + $< > $@; \ + $(EGREP) -q '^[^%]*\\documentclass[^{]*{beamer}' $< && \ + (\ + $(EGREP) -q '^%%[[:space:]]*BEAMER[[:space:]]*LARGE$$' $< && \ + $(ECHO) "BEAMER" > $@ || \ + : > $@ \ + ) || $(sh_true) + +# Store embedding instructions for this document using a special comment +%.embed.make: %.tex + $(QUIET)$(EGREP) '^%%[[:space:]]*NO[[:space:]]*EMBED[[:space:]]*$$' $< \ + && $(ECHO) '' > $@ \ + || $(ECHO) '1' > $@; + +# +# HELPFUL PHONY TARGETS +# + +.PHONY: _all_programs +_all_programs: + $(QUIET)$(ECHO) "== All External Programs Used ==" + $(QUIET)$(call output-all-programs) + +.PHONY: _check_programs +_check_programs: + $(QUIET)$(ECHO) "== Checking Makefile Dependencies =="; $(ECHO) + $(QUIET) \ + allprogs=`\ + ($(call output-all-programs)) | \ + $(SED) \ + -e 's/^[[:space:]]*//' \ + -e '/^#/d' \ + -e 's/[[:space:]]*#.*//' \ + -e '/^=/s/[[:space:]]/_/g' \ + -e '/^[[:space:]]*$$/d' \ + -e 's/^[^=].*=[[:space:]]*\([^[:space:]]\{1,\}\).*$$/\\1/' \ + `; \ + spaces=' '; \ + for p in $${allprogs}; do \ + case $$p in \ + =*) $(ECHO); $(ECHO) "$$p";; \ + *) \ + $(ECHO) -n "$$p:$$spaces" | $(SED) -e 's/^\(.\{0,20\}\).*$$/\1/'; \ + loc=`$(WHICH) $$p`; \ + if [ x"$$?" = x"0" ]; then \ + $(ECHO) "$(C_SUCCESS)Found:$(C_RESET) $$loc"; \ + else \ + $(ECHO) "$(C_FAILURE)Not Found$(C_RESET)"; \ + fi; \ + ;; \ + esac; \ + done + +.PHONY: _check_gpi_files +_check_gpi_files: + $(QUIET)$(ECHO) "== Checking all .gpi files for common errors =="; \ + $(ECHO); \ + for f in $(files.gpi); do \ + result=`$(EGREP) '^([^#]*set terminal |set output )' $$f`; \ + $(ECHO) -n "$$f: "; \ + if [ x"$$result" = x"" ]; then \ + $(ECHO) "$(C_SUCCESS)Okay$(C_RESET)"; \ + else \ + $(ECHO) "$(C_FAILURE)Warning: Problematic commands:$(C_RESET)";\ + $(ECHO) "$(C_ERROR)$$result$(C_RESET)"; \ + fi; \ + done; \ + $(ECHO) + +.PHONY: _all_stems +_all_stems: + $(QUIET)$(ECHO) "== All Stems ==" + $(QUIET)$(call echo-list,$(sort $(default_stems_ss))) + +.PHONY: _includes +_includes: + $(QUIET)$(ECHO) "== Include Stems ==" + $(QUIET)$(ECHO) "=== Sources ===" + $(QUIET)$(call echo-list,$(sort $(source_includes))) + $(QUIET)$(ECHO) "=== Graphics ===" + $(QUIET)$(call echo-list,$(sort $(graphic_includes))) + +.PHONY: _all_sources +_all_sources: + $(QUIET)$(ECHO) "== All Sources ==" + $(QUIET)$(call echo-list,$(sort $(all_files.tex))) + +.PHONY: _dependency_graph +_dependency_graph: + $(QUIET)$(ECHO) "/* LaTeX Dependency Graph */" + $(QUIET)$(call output-dependency-graph) + +.PHONY: _show_dependency_graph +_show_dependency_graph: + $(QUIET)$(call output-dependency-graph,$(graph_stem).dot) + $(QUIET)$(DOT) -Tps -o $(graph_stem).eps $(graph_stem).dot + $(QUIET)$(VIEW_POSTSCRIPT) $(graph_stem).eps + $(QUIET)$(call remove-temporary-files,$(graph_stem).*) + +.PHONY: _sources +_sources: + $(QUIET)$(ECHO) "== Sources ==" + $(QUIET)$(call echo-list,$(sort $(files.tex))) + +.PHONY: _scripts +_scripts: + $(QUIET)$(ECHO) "== Scripts ==" + $(QUIET)$(call echo-list,$(sort $(files_scripts))) + +.PHONY: _graphic_outputs +_graphic_outputs: + $(QUIET)$(ECHO) "== Graphic Outputs ==" + $(QUIET)$(call echo-list,$(sort $(all_graphics_targets))) + +.PHONY: _env +_env: +ifdef .VARIABLES + $(QUIET)$(ECHO) "== MAKE VARIABLES ==" + $(QUIET)$(call echo-list,$(foreach var,$(sort $(.VARIABLES)),'$(var)')) +endif + $(QUIET)$(ECHO) "== ENVIRONMENT ==" + $(QUIET)$(ENV) + +# +# CLEAN TARGETS +# +# clean-generated is somewhat unique - it relies on the .fls file being +# properly built so that it can determine which of the files was generated, and +# which was not. Expect it to silently fail if the .fls file is missing. +# +# This is used to, e.g., clean up index files that are generated by the LaTeX. +.PHONY: clean-generated +clean-generated: + $(QUIET)$(call clean-files,$(foreach e,$(addsuffix .fls,$(all_stems_source)),\ + $(shell $(call get-generated-names,$e)))) + +.PHONY: clean-deps +clean-deps: + $(QUIET)$(call clean-files,$(all_d_targets) *.make *.make.temp *.cookie) + +.PHONY: clean-tex +clean-tex: clean-deps + $(QUIET)$(call clean-files,$(rm_tex)) + +.PHONY: clean-graphics +# TODO: This *always* deletes pstex files, even if they were not generated by +# anything.... In other words, if you create a pstex and pstex_t pair by hand +# an drop them in here without the generating fig file, they will be deleted +# and you won't get them back. It's a hack put in here because I'm not sure we +# even want to keep pstex functionality, so my motivation is not terribly high +# for doing it right. +clean-graphics: + $(QUIET)$(call clean-files,$(all_graphics_targets) *.gpi.d *.pstex *.pstex_t *.dot_t) + +.PHONY: clean-backups +clean-backups: + $(QUIET)$(call clean-files,$(backup_patterns) *.temp) + +.PHONY: clean-auxiliary +clean-auxiliary: + $(QUIET)$(call clean-files,$(graph_stem).*) + +.PHONY: clean-nographics +clean-nographics: clean-tex clean-deps clean-backups clean-auxiliary ; + +.PHONY: clean +clean: clean-generated clean-tex clean-graphics clean-deps clean-backups clean-auxiliary ; + +# +# HELP TARGETS +# + +.PHONY: help +help: + $(help_text) + +.PHONY: version +version: + $(QUIET)\ + $(ECHO) "$(fileinfo) Version $(version)"; \ + $(ECHO) "by $(author)"; \ + +# +# HELP TEXT +# + +define help_text +# $(fileinfo) Version $(version) +# +# by $(author) +# +# Generates a number of possible output files from a LaTeX document and its +# various dependencies. Handles .bib files, \include and \input, and .eps +# graphics. All dependencies are handled automatically by running LaTeX over +# the source. +# +# USAGE: +# +# make [GRAY=1] [VERBOSE=1] [SHELL_DEBUG=1] <target(s)> +# +# STANDARD OPTIONS: +# GRAY: +# Setting this variable forces all recompiled graphics to be grayscale. +# It is useful when creating a document for printing. The default is +# to allow colors. Note that it only changes graphics that need to be +# rebuilt! It is usually a good idea to do a 'make clean' first. +# +# VERBOSE: +# This turns off all @ prefixes for commands invoked by make. Thus, +# you get to see all of the gory details of what is going on. +# +# SHELL_DEBUG: +# This enables the -x option for sh, meaning that everything it does is +# echoed to stderr. This is particularly useful for debugging +# what is going on in $$(shell ...) invocations. One of my favorite +# debugging tricks is to do this: +# +# make -d SHELL_DEBUG=1 VERBOSE=1 2>&1 | less +# +# KEEP_TEMP: +# When set, this allows .make and other temporary files to stick around +# long enough to do some debugging. This can be useful when trying to +# figure out why gnuplot is not doing the right things, for example +# (e.g., look for *head.make). +# +# STANDARD AUXILIARY FILES: +# +# Variables.ini (formerly Makefile.ini, which still works) +# +# This file can contain variable declarations that override various +# aspects of the makefile. For example, one might specify +# +# neverclean := *.pdf *.ps +# onlysources.tex := main.tex +# LATEX_COLOR_WARNING := 'bold red uline' +# +# And this would override the neverclean setting to ensure that pdf +# and ps files always remain behind, set the makefile to treat all +# .tex files that are not "main.tex" as includes (and therefore not +# default targets). It also changes the LaTeX warning output to be +# red, bold, and underlined. +# +# There are numerous variables in this file that can be overridden in +# this way. Search for '?=' to find them all. +# +# The Variables.ini is imported before *anything else* is done, so go +# wild with your ideas for changes to this makefile in there. It +# makes it easy to test them before submitting patches. +# +# If you're adding rules or targets, however, see Targets.ini below. +# +# Targets.ini +# +# This is included much later in the makefile, after all variables and +# targets are defined. This is where you would put new make rules, +# e.g., +# +# generated.tex: generating_script.weird_lang depA depB +# ./generating_script.weird_lang > $$@ +# +# In this file, you have access to all of the variables that the +# makefile creates, like $(onlysources.tex). While accessing those can +# be somewhat brittle (they are implementation details and may change), +# it is a great way to test your ideas when submitting feature requests. +# +# STANDARD ENVIRONMENT VARIABLES: +# +# LATEX_COLOR_WARNING '$(LATEX_COLOR_WARNING)' +# LATEX_COLOR_ERROR '$(LATEX_COLOR_ERROR)' +# LATEX_COLOR_UNDERFULL '$(LATEX_COLOR_UNDERFULL)' +# LATEX_COLOR_OVERFULL '$(LATEX_COLOR_OVERFULL)' +# LATEX_COLOR_PAGES '$(LATEX_COLOR_PAGES)' +# LATEX_COLOR_BUILD '$(LATEX_COLOR_BUILD)' +# LATEX_COLOR_GRAPHIC '$(LATEX_COLOR_GRAPHIC)' +# LATEX_COLOR_DEP '$(LATEX_COLOR_DEP)' +# LATEX_COLOR_SUCCESS '$(LATEX_COLOR_SUCCESS)' +# LATEX_COLOR_FAILURE '$(LATEX_COLOR_FAILURE)' +# +# These may be redefined in your environment to be any of the following: +# +# black +# red +# green +# yellow +# blue +# magenta +# cyan +# white +# +# Bold or underline may be used, as well, either alone or in combination +# with colors: +# +# bold +# uline +# +# Order is not important. You may want, for example, to specify: +# +# export LATEX_COLOR_SUCCESS='bold blue uline' +# +# in your .bashrc file. I don't know why, but you may want to. +# +# STANDARD TARGETS: +# +# all: +# Make all possible documents in this directory. The documents are +# determined by scanning for .tex and .tex.sh (described in more detail +# later) and omitting any file that ends in ._include_.tex or +# ._nobuild_.tex. The output is a set of .pdf files. +# +# If you wish to omit files without naming them with the special +# underscore names, set the following near the top of the Makefile, +# or (this is recommended) within a Makefile.ini in the same directory: +# +# includes.tex := file1.tex file2.tex +# +# This will cause the files listed to be considered as include files. +# +# If you have only few source files, you can set +# +# onlysources.tex := main.tex +# +# This will cause only the source files listed to be considered in +# dependency detection. All other .tex files will be considered as +# include files. Note that these options work for *any* source type, +# so you could do something similar with includes.gpi, for example. +# Note that this works for *any valid source* target. All of the +# onlysources.* variables are commented out in the shipping version of +# this file, so it does the right thing when they simply don't exist. +# The comments are purely documentation. If you know, for example, that +# file.mycoolformat is supported by this Makefile, but don't see the +# "onlysources.mycoolformat" declared in the comments, that doesn't mean +# you can't use it. Go ahead and set "onlysources.mycoolformat" and it +# should do the right thing. +# +# show: +# Builds and displays all documents in this directory. It uses the +# environment-overridable value of VIEW_PDF (currently $(VIEW_PDF)) to +# do its work. +# +# all-graphics: +# Make all of the graphics in this directory. +# +# all-pstex (only for BUILD_STRATEGY=latex): +# Build all fig files into pstex and pstex_t files. Gray DOES NOT WORK. +# +# all-gray-pstex (only for BUILD_STRATEGY=latex): +# Build all fig files into grayscale pstex and pstex_t files. +# +# all-dot2tex: +# Build all dot files into tex files. +# +# show-graphics: +# Builds and displays all graphics in this directory. Uses the +# environment-overridable value of VIEW_GRAPHICS (currently +# $(VIEW_GRAPHICS)) to do its work. +# +# clean: +# Remove ALL generated files, leaving only source intact. +# This will *always* skip files mentioned in the "neverclean" variable, +# either in this file or specified in Makefile.ini: +# +# neverclean := *.pdf *.ps +# +# The neverclean variable works on all "clean" targets below, as well. +# +# clean-graphics: +# Remove all generated graphics files. +# +# clean-backups: +# Remove all backup files: $(backup_patterns) +# (XFig and other editors have a nasty habit of leaving them around) +# Also removes Makefile-generated .temp files +# +# clean-tex: +# Remove all files generated from LaTeX invocations except dependency +# information. Leaves graphics alone. +# +# clean-deps: +# Removes all auto-generated dependency information. +# +# clean-auxiliary: +# Removes extra files created by various targets (like the dependency +# graph output). +# +# clean-nographics: +# Cleans everything *except* the graphics files. +# +# help: +# This help text. +# +# version: +# Version information about this LaTeX makefile. +# +# DEBUG TARGETS: +# +# _all_programs: +# A list of the programs used by this makefile. +# +# _check_programs: +# Checks your system for the needed software and reports what it finds. +# +# _check_gpi_files: +# Checks the .gpi files in the current directory for common errors, such +# as specification of the terminal or output file inside of the gpi file +# itself. +# +# _dependency_graph: +# Outputs a .dot file to stdout that represents a graph of LaTeX +# dependencies. To see it, use the _show_dependency_graph target or +# direct the output to a file, run dot on it, and view the output, e.g.: +# +# make _dependency_graph > graph.dot +# dot -T ps -o graph.eps graph.dot +# gv graph.eps +# +# _show_dependency_graph: +# Makes viewing the graph simple: extracts, builds and displays the +# dependency graph given in the _dependency_graph target using the value +# of the environment-overridable VIEW_POSTSCRIPT variable (currently set +# to $(VIEW_POSTSCRIPT)). The postscript viewer is used because it +# makes it easier to zoom in on the graph, a critical ability for +# something so dense and mysterious. +# +# _all_sources: +# List all .tex files in this directory. +# +# _sources: +# Print out a list of all compilable sources in this directory. This is +# useful for determining what make thinks it will be using as the +# primary source for 'make all'. +# +# _scripts: +# Print out a list of scripts that make knows can be used to generate +# .tex files (described later). +# +# _all_stems: +# Print a list of stems. These represent bare targets that can be +# executed. Listing <stem> as a bare target will produce <stem>.pdf. +# +# _includes: +# A list of .d files that would be included in this run if _includes +# weren't specified. This target may be used alone or in conjunction +# with other targets. +# +# _graphic_outputs: +# A list of all generated .eps files +# +# _env: +# A list of environment variables and their values. If supported by +# your version of make, also a list of variables known to make. +# +# FILE TARGETS: +# +# %, %.pdf: +# Build a PDF file from the corresponding %.tex file. +# +# If BUILD_STRATEGY=pdflatex, then this builds the pdf directly. +# Otherwise, it uses this old-school but effective approach: +# +# latex -> dvips -> ps2pdf +# +# The BUILD_STRATEGY can be overridden in Makefile.ini in the same +# directory. The default is pdflatex. +# +# Reasons for using latex -> dvips include the "psfrag" package, and the +# generation of postscript instead of PDF. Arguments for using pdflatex +# include "new and shiny" and "better supported." I can't argue with +# either of those, and supporting them both didn't turn out to be that +# difficult, so there you have it. Choices. +# +# %._show: +# A phony target that builds the pdf file and then displays it using the +# environment-overridable value of VIEW_PDF ($(VIEW_PDF)). +# +# %._graphics: +# A phony target that generates all graphics on which %.pdf (or %.dvi) +# depends. +# +# %.ps (only for BUILD_STRATEGY=latex): +# Build a Postscript file from the corresponding %.tex file. +# This is done using dvips. Paper size is automatically +# extracted from the declaration +# +# \documentclass[<something>paper] +# +# or it is the system default. +# +# If using beamer (an excellent presentation class), the paper +# size is ignored. More on this later. +# +# %.dvi (only for BUILD_STRATEGY=latex): +# Build the DVI file from the corresponding %.tex file. +# +# %.ind: +# Build the index for this %.tex file. +# +# %.gls: +# Build the nomenclature glossary for this %.tex file. +# +# %.nls: +# Build the (newer) nomenclature file for this %.tex file. +# +# %.eps: +# Build an eps file from one of the following file types: +# +# .dot : graphviz +# .gpi : gnuplot +# .fig : xfig +# .xvg : xmgrace +# .svg : scalable vector graphics (goes through inkscape) +# .png : png (goes through NetPBM) +# .jpg : jpeg (goes through ImageMagick) +# .eps.gz : gzipped eps +# +# The behavior of this makefile with each type is described in +# its own section below. +# +# %.pstex{,_t} (only for BUILD_STRATEGY=latex): +# Build a .pstex_t file from a .fig file. +# +# FEATURES: +# +# Optional Binary Directory: +# If you create the _out_ directory in the same place as the makefile, +# it will automatically be used as a dumping ground for .pdf (or .dvi, +# .ps, and .pdf) output files. +# +# Alternatively, you can set the BINARY_TARGET_DIR variable, either as a +# make argument or in Makefile.ini, to point to your directory of +# choice. Note that no pathname wildcard expansion is done in the +# makefile, so make sure that the path is complete before going in +# there. E.g., if you want to specify something in your home directory, +# use $$HOME/ instead of ~/ so that the shell expands it before it gets +# to the makefile. +# +# External Program Dependencies: +# Every external program used by the makefile is represented by an +# ALLCAPS variable at the top of this file. This should allow you to +# make judgments about whether your system supports the use of this +# makefile. The list is available in the ALL_PROGRAMS variable and, +# provided that you are using GNU make 3.80 or later (or you haven't +# renamed this file to something weird like "mylatexmakefile" and like +# invoking it with make -f) can be viewed using +# +# make _all_programs +# +# Additionally, the availability of these programs can be checked +# automatically for you by running +# +# make _check_programs +# +# The programs are categorized according to how important they are and +# what function they perform to help you decide which ones you really +# need. +# +# Colorized Output: +# The output of commands is colorized to highlight things that are often +# important to developers. This includes {underfull,overfull} +# {h,v}boxes, general LaTeX Errors, each stage of document building, and +# the number of pages in the final document. The colors are obtained +# using 'tput', so colorization should work pretty well on any terminal. +# +# The colors can be customized very simply by setting any of the +# LATEX_COLOR_<CONTEXT> variables in your environment (see above). +# +# Predecessors to TeX Files: +# Given a target <target>, if no <target>.tex file exists but a +# corresponding script or predecessor file exists, then appropriate +# action will be taken to generate the tex file. +# +# Currently supported script or predecessor languages are: +# +# sh: %.tex.sh +# perl: %.tex.pl +# python: %.tex.py +# +# Calls the script using the appropriate interpreter, assuming that +# its output is a .tex file. +# +# The script is called thus: +# +# <interpreter> <script file name> <target tex file> +# +# and therefore sees exactly one parameter: the name of the .tex +# file that it is to create. +# +# Why does this feature exist? I ran into this while working on +# my paper dissertation. I wrote a huge bash script that used a +# lot of sed to bring together existing papers in LaTeX. It +# would have been nice had I had something like this to make my +# life easier, since as it stands I have to run the script and +# then build the document with make. This feature provides hooks +# for complicated stuff that you may want to do, but that I have +# not considered. It should work fine with included dependencies, +# too. +# +# Scripts are run every time make is invoked. Some trickery is +# employed to make sure that multiple restarts of make don't cause +# them to be run again. +# +# reST: %.rst +# +# Runs the reST to LaTeX converter to generate a .tex file +# If it finds a file names _rststyle_._include_.tex, uses it as +# the "stylesheet" option to rst2latex. +# +# Note that this does not track sub-dependencies in rst files. It +# assumes that the top-level rst file will change if you want a +# rebuild. +# +# Dependencies: +# +# In general, dependencies are extracted directly from LaTeX output on +# your document. This includes +# +# * Bibliography information +# * \include or \input files (honoring \includeonly, too) +# * Graphics files inserted by the graphicx package +# +# Where possible, all of these are built correctly and automatically. +# In the case of graphics files, these are generated from the following +# file types: +# +# GraphViz: .dot +# GNUPlot: .gpi +# XFig: .fig +# XMgrace: .xvg +# SVG: .svg +# PNG: .png +# JPEG: .jpg +# GZipped EPS: .eps.gz +# +# If the file exists as a .eps already, it is merely used (and will not +# be deleted by 'clean'!). +# +# LaTeX and BibTeX are invoked correctly and the "Rerun to get +# cross-references right" warning is heeded a reasonable number of +# times. In my experience this is enough for even the most troublesome +# documents, but it can be easily changed (if LaTeX has to be run after +# BibTeX more than three times, it is likely that something is moving +# back and forth between pages, and no amount of LaTeXing will fix +# that). +# +# \includeonly is honored by this system, so files that are not +# specified there will not trigger a rebuild when changed. +# +# Beamer: +# A special TeX source comment is recognized by this makefile (only when +# BUILD_STRATEGY=latex, since this invokes psnup): +# +# %%[[:space:]]*BEAMER[[:space:]]*LARGE +# +# The presence of this comment forces the output of dvips through psnup +# to enlarge beamer slides to take up an entire letter-sized page. This +# is particularly useful when printing transparencies or paper versions +# of the slides. For some reason landscape orientation doesn't appear +# to work, though. +# +# If you want to put multiple slides on a page, use this option and then +# print using mpage, a2ps, or psnup to consolidate slides. My personal +# favorite is a2ps, but your mileage may vary. +# +# When beamer is the document class, dvips does NOT receive a paper size +# command line attribute, since beamer does special things with sizes. +# +# GNUPlot Graphics: +# When creating a .gpi file, DO NOT INCLUDE the "set terminal" or "set +# output" commands! The makefile will include terminal information for +# you. Besides being unnecessary and potentially harmful, including the +# terminal definition in the .gpi file makes it harder for you, the one +# writing the document, to preview your graphics, e.g., with +# +# gnuplot -persist myfile.gpi +# +# so don't do specify a terminal or an output file in your .gpi files. +# +# When building a gpi file into an eps file, there are several features +# available to the document designer: +# +# Global Header: +# The makefile searches for the files in the variable GNUPLOT_GLOBAL +# in order: +# +# ($(GNUPLOT_GLOBAL)) +# +# Only the first found is used. All .gpi files in the directory are +# treated as though the contents of GNUPLOT_GLOBAL were directly +# included at the top of the file. +# +# NOTE: This includes special comments! (see below) +# +# Font Size: +# A special comment in a .gpi file (or a globally included file) of +# the form +# +# ## FONTSIZE=<number> +# +# will change the font size of the GPI output. If font size is +# specified in both the global file and the GPI file, the +# specification in the individual GPI file is used. +# +# Grayscale Output: +# GNUplot files also support a special comment to force them to be +# output in grayscale *no matter what*: +# +# ## GRAY +# +# This is not generally advisable, since you can always create a +# grayscale document using the forms mentioned above. But, if your +# plot simply must be grayscale even in a document that allows +# colors, this is how you do it. +# +# XFig Graphics: +# No special handling is done with XFig, except when a global +# grayscale method is used, e.g. +# +# make GRAY=1 document +# +# In these cases the .eps files is created using the -N switch to +# fig2dev to turn off color output. (Only works with eps, not pstex +# output) +# +# GraphVis Graphics: +# Color settings are simply ignored here. The 'dot' program is used +# to transform a .dot file into a .eps file. +# +# If you want, you can use the dot2tex program to convert dot files +# to tex graphics. The default is to just call dot2tex with no +# arguments, but you can change the DOT2TEX definition to include +# options as needed (in your Makefile.ini). +# +# Note that, as with pstex, the makefile cannot use latex's own +# output to discover all missing dot_t (output) files, since anytime +# TeX includes TeX, it has to bail when it can't find the include +# file. It can therefore only stop on the first missing file it +# discovers, and we can't get a large list of them out easily. +# +# So, the makefile errors out if it's missing an included dot_t +# file, then prompts the user to run this command manually: +# +# make all-dot2tex +# +# GZipped EPS Graphics: +# +# A .eps.gz file is sometimes a nice thing to have. EPS files can get +# very large, especially when created from bitmaps (don't do this if you +# don't have to). This makefile will unzip them (not in place) to +# create the appropriate EPS file. +# +# +endef + +# +# DEPENDENCY CHART: +# +# digraph "g" { +# rankdir=TB +# size="9,9" +# edge [fontsize=12 weight=10] +# node [shape=box fontsize=14 style=rounded] +# +# eps [ +# shape=Mrecord +# label="{{<gpi> GNUplot|<epsgz> GZip|<dot> Dot|<fig> XFig}|<eps> eps}" +# ] +# pstex [label="%.pstex"] +# pstex_t [label="%.pstex_t"] +# tex_outputs [shape=point] +# extra_tex_files [shape=point] +# gpi_data [label="<data>"] +# gpi_includes [label="_include_.gpi"] +# aux [label="%.aux"] +# fls [label="%.fls"] +# idx [label="%.idx"] +# glo [label="%.glo"] +# ind [label="%.ind"] +# log [label="%.log"] +# tex_sh [label="%.tex.sh"] +# rst [label="%.rst"] +# tex [ +# shape=record +# label="<tex> %.tex|<include> _include_.tex" +# ] +# include_aux [label="_include_.aux"] +# file_bib [label=".bib"] +# bbl [label="%.bbl"] +# dvi [label="%.dvi"] +# ps [label="%.ps"] +# pdf [label="%.pdf"] +# fig [label=".fig"] +# dot [label=".dot"] +# gpi [label=".gpi"] +# eps_gz [label=".eps.gz"] +# +# gpi_files [shape=point] +# +# rst -> tex:tex [label="reST"] +# tex_sh -> tex:tex [label="sh"] +# tex_pl -> tex:tex [label="perl"] +# tex_py -> tex:tex [label="python"] +# tex -> tex_outputs [label="latex"] +# tex_outputs -> dvi +# tex_outputs -> aux +# tex_outputs -> log +# tex_outputs -> fls +# tex_outputs -> idx +# tex_outputs -> include_aux +# aux -> bbl [label="bibtex"] +# file_bib -> bbl [label="bibtex"] +# idx -> ind [label="makeindex"] +# glo -> gls [label="makeindex"] +# nlo -> nls [label="makeindex"] +# gls -> extra_tex_files +# nls -> extra_tex_files +# ind -> extra_tex_files +# bbl -> extra_tex_files +# eps -> extra_tex_files +# extra_tex_files -> dvi [label="latex"] +# gpi_files -> eps:gpi [label="gnuplot"] +# gpi -> gpi_files +# gpi_data -> gpi_files +# gpi_includes -> gpi_files +# eps_gz -> eps:epsgz [label="gunzip"] +# fig -> eps:fig [label="fig2dev"] +# fig -> pstex [label="fig2dev"] +# fig -> pstex_t [label="fig2dev"] +# pstex -> pstex_t [label="fig2dev"] +# dot -> eps:dot [label="dot"] +# dvi -> ps [label="dvips"] +# include_aux -> bbl [label="bibtex"] +# ps -> pdf [label="ps2pdf"] +# +# edge [ color=blue label="" style=dotted weight=1 fontcolor=blue] +# fls -> tex:include [label="INPUT: *.tex"] +# fls -> file_bib [label="INPUT: *.aux"] +# aux -> file_bib [label="\\bibdata{...}"] +# include_aux -> file_bib [label="\\bibdata{...}"] +# log -> gpi [label="Graphic file"] +# log -> fig [label="Graphic file"] +# log -> eps_gz [label="Graphic file"] +# log -> dot [label="Graphic file"] +# log -> idx [label="No file *.ind"] +# log -> glo [label="No file *.gls"] +# log -> nlo [label="No file *.nls"] +# gpi -> gpi_data [label="plot '...'"] +# gpi -> gpi_includes [label="load '...'"] +# tex:tex -> ps [label="paper"] +# tex:tex -> pdf [label="embedding"] +# } +# + +# +# DEPENDENCY CHART SCRIPT +# +# $(call output_dependency_graph,[<output file>]) +define output-dependency-graph + if [ -f '$(this_file)' ]; then \ + $(SED) \ + -e '/^[[:space:]]*#[[:space:]]*DEPENDENCY CHART:/,/^$$/!d' \ + -e '/DEPENDENCY CHART/d' \ + -e '/^$$/d' \ + -e 's/^[[:space:]]*#//' \ + $(this_file) $(if $1,> '$1',); \ + else \ + $(ECHO) "Cannot determine the name of this makefile."; \ + fi +endef +# +.PHONY: Targets.ini $(HOME)/.latex-makefile/Targets.ini +-include Targets.ini +-include $(HOME)/.latex-makefile/Targets.ini +# +# vim: noet sts=0 sw=8 ts=8 + diff --git a/bib b/bib new file mode 160000 +Subproject a819050e30bb6906858165796655c0c726843a3 @@ -0,0 +1,76 @@ +%\documentclass[localFont,alternative,10pt,compact,monochrome]{yaac-another-awesome-cv} +%\documentclass[dsvariant,alternative,12pt,compact,monochrome]{yaac-another-awesome-cv} +\documentclass[dsvariant,alternative,12pt,compact]{yaac-another-awesome-cv} +\name{Dr. Suren A. Chilingaryan}{} +\tagline{Data Processing and Performance Expert | Lead of Cloud Computing } +\addbibresource{bib/csa.bib} +\addbibresource{bib/csaproc.bib} + +\socialinfo{ + \email{csa@suren.me} +% \smartphone{+49 (176) 438-53094} + \skype{csa8000} + \website{http://suren.me}{suren.me} + \vspace{0.5em} + + \scholar{0Qa5rG8AAAAJ}{Scholar}\\ +% \orcid{0000-0002-2909-6363}{OrcID} + \linkedin{suren-chilingaryan-5501636} +% \rg{Suren-Chilingaryan-2}{ResearchGate} +} + +\headermsg{ + I do research in high-performance and heterogeneous computing and I apply it to architect online systems for scientific instrumentation. + With improvements in detector technology, I believe the new approaches are required to keep the pace with increasing data rates. + Codesign of detector, software, and analysis algorithms is often a key for successful projects. + %With deep knowledge across computer science and IT technology, I can grasp complex systems as a whole and pay attention to the performance of critical components. + Currently, I lead an effort to adopt cloud technologies for data acquisition and control systems. +} + + +%\photo{2.5cm}{darwiin.png} +%\socialinfo{ +% \linkedin{christopheroger} +% \github{darwiin}\\ +% \smartphone{+687 831 831} +% \email{christophe.roger@mail.com}\\ +% \address{17 Rue de Bretagne, 98835 Dumbéa, Nouvelle-Calédonie}\\ +% \infos{Né le 23 septembre 1982 (35 ans) à Nouméa, Nouvelle-Calédonie} +%} + +% Uncomment the following line and use a value from 1.5cm to 2.5cm +%\setleftcolumnlength{2.5cm} + + +\begin{document} + + \makecvheader + +% \makecvfooter +% {\selectlanguage{english}\today} +% {\textsc{Suren A. Chilingaryan - CV}} +% {\thepage} + + + \input{section_competences} + \input{section_employment} + \input{section_education} + \input{section_academic} +% \input{section_skills} + + \newpage + \input{section_experiments} + \input{section_funding} + \input{section_leadership} + \input{section_responsibilities} + \input{section_software} + \input{section_research} + \input{section_supervision} +% \input{section_references} % Section références + + \newpage + \printbibliography[title={\textsc{Selected publications}}] + + \newpage + \input{section_presentations} +\end{document}
\ No newline at end of file diff --git a/section_academic.tex b/section_academic.tex new file mode 100644 index 0000000..88eea14 --- /dev/null +++ b/section_academic.tex @@ -0,0 +1,15 @@ +\subtitle{Academic achievments}{\faTasks} + +\begin{categories} + \category{Experiments} {\makecell{Member of \refexp{KATRIN}, \refexp{PANDAS}, \refexp{SEVAN} collaborations,\\ contributed to \refexp{CMS}, Edelweiss, \refexp{KIT Cube}}} + \category{Collaborations} {\refexp{ASEC}, \reffac{ESRF}, \refuni{Desy}, \refcol{TPU}, \refcol{SCI}, \refcol{CCPi Network}} %\refuni{University of Manchester}} + \category{Funding} {\makecell{Contributing author to BMBF grants \hyperlink{proj:ADEI}{01DK13019} (15 k€),\\ \hyperlink{proj:UFO}{05K10CKB} and \hyperlink{proj:UFO}{05K10VKE} (2.5 m€ total)}} + \category{Projects} {Maintain 5 software frameworks, coordinated and developed - 12} + \category{Supervision} {\makecell{Supervise 2 PhD students, co-supervised 4 PhD students (2 graduated),\\ 10 Master students and 20 internships}} + \category{Tutoring} {\makecell{GPU programming tutorials at summer schools,\\ seminar on advanced topics in parallel programming}} + \category{Publications} {\orcidlink{0000-0002-2909-6363}{59 peer-reviewed publications}, \scholarlink{0Qa5rG8AAAAJ}{h-rank: 18}} + \category{Presentations} {7 invited talks, 10 conference talks, 15 seminars} +\end{categories} + + +%edelweiss? diff --git a/section_competences.tex b/section_competences.tex new file mode 100644 index 0000000..08f219d --- /dev/null +++ b/section_competences.tex @@ -0,0 +1,10 @@ +\subtitle{Areas of expertise}{\faTasks} + +\begin{categories} + \category{}{High performance computing} + \category{}{Distributed data acquisition and control systems} + \category{}{Performance analysis and software optimization techniques} + \category{}{Parallel algorithms and parallel hardware architectures} + \category{}{Low-latency communication in heterogeneous systems} + \category{}{Cloud-based data management and visualization} +\end{categories} diff --git a/section_education.tex b/section_education.tex new file mode 100644 index 0000000..3cc37fc --- /dev/null +++ b/section_education.tex @@ -0,0 +1,6 @@ +\subtitle{Education}{\faSuitcase} + +\begin{jobs} + \titledevent{July 2006} {PhD}{degree in Computer Engineering “Data Exchange Solution for Distributed Data Acquisition Systems and its application for Cosmic Ray Monitor Networks” at National Academy of Science, Armenia} + \titledevent{\ivl{1996}{2001}} {MSc}{in Mathematics “Data Processing using Neural Networks” at Moscow State University} +\end{jobs} diff --git a/section_employment.tex b/section_employment.tex new file mode 100644 index 0000000..8001fc3 --- /dev/null +++ b/section_employment.tex @@ -0,0 +1,11 @@ +\subtitle{Employment history}{\faSuitcase} +%\renewcommand{\labelitemi}{$\bullet$} + +\begin{jobs} + \jobevent {\since{2020}} {Leader of CloudDAQ Project}{Karlsruhe Institute of Technology}{Research on cloud technologies for control and data acquisition applications} + \jobevent {\ivl{2013}{2020}} {Data Processing and Performance Expert}{Karlsruhe Institute of Technology}{High-performance instrumentation for large-scale scientific experiments} + \jobevent {\ivl{2007}{2012}} {Postdoctoral Researcher}{KIT}{Data management \& software optimization} + \jobevent {\ivl{2005}{2007}} {Researcher}{Yerevan Physics Institute}{DAQ for particle detector networks} + \jobevent {\ivl{2002}{2005}} {Associate Researcher}{Forschungszentrum Karlsruhe}{} + \jobevent {\ivl{2001}{2002}} {Software Engineer}{Yerevan Physics Institute}{} +\end{jobs} diff --git a/section_experiments.tex b/section_experiments.tex new file mode 100644 index 0000000..c709da6 --- /dev/null +++ b/section_experiments.tex @@ -0,0 +1,30 @@ +\subtitle{Experiments and collaborations}{\faTasks} +% Conceptually: +% * Experiment - ends of its own, Facility - to run other experiments, Collaboration - to build facilities. +% Skipped: +% - Since 2016 SmartGrid +% - 2017 – 2020 ROOF (DFG-funded): Dynamical tracking of structures in multi-phase fluids by ultra-fast X-ray tomography and image-based scanning + +\begin{events} + \eventsection{Current}{} + \experiment {\since{2020}} {PANDA} {anti-Proton ANnihilations at Darmstadt} {https://panda.gsi.de}{Member} + \facility {\since{2013}} {BESS} {KIT Battery Technology Center} {http://www.batterietechnikum.kit.edu}{} + \facility {\since{2008}} {KARA} {Karlsruhe Research Accelerator} {https://www.ibpt.kit.edu/kara.php}{} + \experiment {\since{2007}} {KATRIN} {Karlsruhe Tritium Neutrino Experiment} {http://www.katrin.kit.edu}{Member} + \experiment {\since{2006}} {SEVAN} {Space Environment Viewing and Analysis Network} {http://crd.yerphi.am/space_environmental_viewing_and_analysis_network}{Member} + \experiment {\since{2001}} {ASEC} {Aragats Space Environmental Center} {http://crd.yerphi.am/ASEC_Monitors}{Member} + + \eventsection{Past}{events} + \collaboration{2020} {CCPi Network} {Collaborative Computational Project for Imaging} {https://www.ccpi.ac.uk}{} + \facility {\ivl{2014}{2018}} {HZG} {Helmholtz-Zentrum Geesthacht} {https://www.hzg.de/institutes_platforms/materials_research/physical_metallurgy/x_ray_imaging/index.php.en}{} + \collaboration{\ivl{2010}{2018}} {TPU} {Tomsk Polytechnic University} {https://tpu.ru}{} + \collaboration{\ivl{2016}{2017}} {CMS} {Compact Muon Solenoid} {https://cms.cern}{} + \collaboration{\ivl{2016}{2017}} {UFO} {German-Russian Collaboration on Ultrafast Tomography} {https://ufo.kit.edu}{} + \collaboration{\ivl{2010}{2017}} {SCI} {Shubnikov Crystallography Institute} {https://www.crys.ras.ru}{} + \experiment {\ivl{2009}{2015}} {KIT Cube} {Integrated atmospheric observation system} {http://www.kitcube.kit.edu}{} + \facility {\ivl{2009}{2015}} {KIT Tower} {Meteorological tower at KIT North Campus} {https://www.imk-tro.kit.edu/english/7778.php}{} + \facility {\ivl{2008}{2014}} {TOSKA} {Test facility for fusion magnets at KIT} {}{} + \facility {\ivl{2008}{2014}} {ESRF} {European Synchrotron Radiation Facility} {http://esrf.eu/}{} % Collaborated on high-speed tomography with GPU +\end{events} + + diff --git a/section_funding.tex b/section_funding.tex new file mode 100644 index 0000000..f250ce8 --- /dev/null +++ b/section_funding.tex @@ -0,0 +1,33 @@ +\subtitle{Funding}{\faTasks} +% skipped: +% 2016 DFG ROOF (2017-2020) +% unfunded projects. +% 2018 ? KURDAT? SuperNOVA? +% 2018 ? IMS (with Busman) +% xxxx DFG uPIV +% 2014 H2020 PANDAS? (was pretty-much representing KIT) +% ???? PNI-HDRI? +% Decided to skip +% \funding {2021} {Helmholtz} {\ivl{2021}{2023}} {Submitted}{a proposal to Helmholtz-OCPC Program}{to initiate Sino-German cooperation on leveraging HPC for data acquisition systems} +% \funding {2015} {COST (travel)} {2015} {Applied for}{COST travel grant for a Master student}{to transfer a fast reconstruction technology to \reffac{ESRF}} +% \funding {2014} {H2020} {} {Represented KIT in}{a consortium preparing \emph{unfunded} PaN-DAAS proposal for H2020 funding}{(data analysis services for photon and neutron facilities)} + +\begin{complexevents} + \funding {2021} {\refexp{KATRIN} (100 k€)} {KaaS (2021)} {} + {Author}{investments for upgrade of \refsoft{KaaS} cluser}{} + \funding {2020} {KCETA (6 k€)} {RoCE (2020)} {} + {Contributing author}{investments to integrate ROCe protocol in IPE DAQ}{} + \funding {2019} {Helmholtz} {MT-DTS (\ivl{2021}{2027})} {} + {Technical contribution}{\refproj{MT-DTS ST2} subtopic in \refproj{Helmholtz Matter and Technologie} research program}{} + \funding {2013, 2016} {BMBF (750 k€)} {ASTOR (\ivl{2013}{2016}), NOVA (\ivl{2016}{2020})} {ASTOR,NOVA} + {Technical contribution}{2 projects on collaborative anlaysis of tomographic datasets in the cloud}{} + \funding {2012} {BMBF (15 k€)} {ADEI (\ivl{2013}{2015})} {ADEI} + {Contributing author}{BMBF networking grant for cooperation with \refexp{ASEC}}{on data analysis platform} + \funding {2011} {Diaspora (100 k\$)} {VMAV (\ivl{2012}{2014})} {VMAW} + {Contributing author}{Vaporciyan Multivariate Analysis and Visualization (non-governamental grant by Armenian diaspora)}{for establishing multivariate analysis platform at \refexp{ASEC}} + \funding {2010, 2011} {BMBF (2.5 m€)} {UFO-1 (\ivl{2010}{2013}), UFO-2 (\ivl{2012}{2015})} {UFO} + {Contributing author}{Ultra Fast X-ray Imaging of Scientific Processes with On-line Assessment and Data-driven Process Control}{I have contributed vision of online data processing system and provided definitions of the corresponding work-package} + \funding {2009} {Helmholtz} {HDRI (\ivl{2010}{2014})} {} + {Technical contribution}{HDRI (High data rate processing and analysis) initiative in PNI (Photons, Neutrons, Ions) research program}{} +\end{complexevents} + diff --git a/section_leadership.tex b/section_leadership.tex new file mode 100644 index 0000000..29c9c40 --- /dev/null +++ b/section_leadership.tex @@ -0,0 +1,16 @@ +\subtitle{Leadership}{\faTasks} + + +\begin{complexevents} +% Currently, total numbers in project. Range or maximum extent are possibly more correct +% Skipped: +% ROOF +% PhD hunting? Outsourcing with Jalal? + + \leadership{\since{2020}} {Leading efforts to}{prepare \refexp{KATRIN} data infrastructure for Tristan detector} {Group}{2 PhD, 2 students} + \leadership{\ivl{2018}{2020}} {Led}{development of \refexp{KATRIN} cloud platform and migration of services} {Group}{2 Postdocs, PhD, 2 students} % organization: Marco,Jan,Jonas,NTJ,etc. + \leadership{\ivl{2013}{2018}} {Led}{volume visualization task force in \refproj{ASTOR} and \refproj{NOVA} projects} {Group}{PhD, 5 students} + \leadership{\ivl{2010}{2018}} {Coordinated}{a program on stewardship of thesisis for \refuni{TPU} students} {Participation}{3 PhD, 12 students} + \leadership{\ivl{2010}{2016}} {Led}{a collaboration with \refexp{ASEC} on online data analysis platform} {Group}{Postdoc and PhD in \refuni{KIT}, Postdoc and 2 engineers at \refexp{ASEC}, 10 students} + \leadership{\ivl{2010}{2017}} {Coordinated}{work-package on tomographic software in \refproj{UFO} project} {Group}{3 PhD in \refuni{KIT}, 3 PhD in partner universities, 5 students} +\end{complexevents} diff --git a/section_presentations.tex b/section_presentations.tex new file mode 100644 index 0000000..ca50995 --- /dev/null +++ b/section_presentations.tex @@ -0,0 +1,61 @@ +\subtitle{Selected presentations}{\faSuitcase} + +\begin{events} +% Parallel sessions is standard, everything else should be noted (don't specify "plenary" if there is no parallel sessions) +% Skip: local workshops like visions and collaboration meetings +% ESRF: visit in 2019 (no seminar), EXTREMA Cost workshop (no talk) +% Visions 2009 - 2020 (except 2017) +% Collaboration meetings, ROOF/2018, ASTOR/2014 (Desy), PANDAS/2014 +% Local: RoCE/2020, KaaS/2020, Alps/2012 (local meeting on Flute) +% Presentation for guests: Nicolas(Soleil) visits (multiple) +% Unclear: 2011/UFO (internal), 2012/Graphics (internal?) + + + \eventsection{Conferences}{} + \conference{\at{Oct}{2019}} {invited} {Accelerating Remote Visualization of Large Tomographic Data Volumes} {Global Innovation Forum, Armenia}{} + \conference{\at{Oct}{2018}} {} {Balancing load of GPU subsystems to accelerate image reconstruction in parallel beam tomography} {SBAC-PAD 2018 conference, Lyon, France}{} + \conference{\at{Okt}{2014}} {} {Computing Infrastructure for Online Monitoring and Control of High-throughput DAQ Electronics} {10th PCAPAC conference, Karlsruhe, Germany}{} + \conference{\at{Sep}{2014}} {invited} {UFO – Status and Perspectives of Ultrafast X-Ray Imaging at ANKA" and "Fast Reconstruction Algorithms for Computed Tomography} {SNI2014, Bonn, Germany} {Delivered by M. Balzer} +% \conference{\at{Sep}{2014}} {invited} {Fast Reconstruction Algorithms for Computed Tomography} {SNI2014, Bonn, Germany} {Delivered by M. Balzer} + \conference{\at{Jun}{2012}} {} {A High Throughput Platform for Real-Time X-ray Imaging" and "Advanced Linux PCI Services} {18th IEEE Real-Time Conference, Berkeley, CA, USA}{} +% \conference{\at{Jun}{2012}} {poster} {Advanced Linux PCI Services} {18th IEEE Real-Time Conference, Berkeley, CA, USA}{} + \conference{\at{May}{2012}} {} {A High Performance Platform for Real-Time X-ray Imaging} {GPU Technology Conference, San Jose, CA, USA}{} +% \conference{\at{Nov}{2011}} {poster} {A GPU-based Architecture for Real-Time Data Assessment at Synchrotron Experiments} {SC11 Supercomputing Conference, Seattle, WA, USA}{} +% \conference{\at{Oct}{2010}} {poster} {ADEI – Web 2.0 Data Manager for the KATRIN Neutrino Experiment} {CHEP 2010 Conference, Taipei, Taiwan}{} +% \conference{\at{Sep}{2010}} {poster} {A GPU-based Architecture for Real-Time Data Assessment at Synchrotron Experiments} {GPU Technology Conference, San Jose, CA, USA} {canceled because of visa} +% \conference{\at{Sep}{2010}} {poster} {GPU Computing for Real-Time Optical Measurement Techniques} {GPU Technology Conference, San Jose, CA, USA} {canceled because of visa} + \conference{\at{May}{2010}} {} {A GPU-based Architecture for Real-Time Data Assessment at Synchrotron Experiments} {17th IEEE Real-Time Conference, Lisbon, Portugal}{} +% \conference{\at{May}{2009}} {poster} {A Novel Approach for Online Monitoring for High Data-Rate Image-Based Instrumentation} {16th IEEE Real-Time Conference, Beijing, China} {presented by ???} + \conference{\at{Apr}{2009}} {} {Comparison of fast multi-platform XML Libraries: Results for January 2009} {BenchmarX'09 workshop at DASFAA 2009, Brisbane, Australia}{} +% \conference{\at{Mar}{2009}} {poster} {Advanced Data Extraction Infrastructure: Web Based System for Treatment of Time Series} {CHEP 2009, Prague, Czech}{} +% \conference{\at{Mar}{2007}} {poster} {The Aragats Data Acquisition System for Highly Distributed Particle Detecting Networks} {CHEP 2007, Victoria, BC, Canada}{} + \conference{\at{Sep}{2007}} {} {Advanced Data Acquisition System for SEVAN} {SEE2007 Symposium, Athens, Greece}{} + + \eventsection{Workshops}{events} +% \workshop{\at{Mar}{2019}} {} {UFO Cloud: Data-Acquisition-as-a-Service} {Matter and Technology program meeting, Germany}{} + \workshop{\at{Nov}{2018}} {} {High-Speed Tomography: Fine-tuning back projection for GPU architectures} {CAMERA workshop, Berkeley, CA, USA}{} + \workshop{\at{Nov}{2017}} {invited} {UFO - A platform for high data rate instrumentation with GPUs} {EUCALL GPU/FPGA Workshop at XFEL, Desy, Hamburg}{} + \workshop{\at{May}{2017}} {invited} {SHAPe: Scalable and Highly Available Platform for Scientific Data Portals} {ARBRA Workshop, Nor-Amberd, Armenia}{} + \workshop{\at{Apr}{2017}} {invited} {Tuning tomographic reconstruction for different parallel architectures} {workshop on Real-Time 3D Tomography, CWI, Amsterdam}{} +% \workshop{\at{Mar}{2016}} {} {Efficient GPU-enabled computing infrastructure for rapid prototyping high-speed scientific detectors} {Matter and Technology program meeting, Germany}{} + \workshop{\at{Jan}{2016}} {invited} {Performance-oriented instrumentation for high-speed synchrotron imaging} {workshop on Large Scale Tomography, Szeged, Hungary}{} +% \workshop{\at{Mar}{2013}} {} {High-performance computing hardware for high data rates} {HDRI program meeting, Germany}{} +% \workshop{\at{Oct}{2013}} {notalk} {} {EXTREMA workshop on Advanced X-Ray Tomography, ESRF, Grenoble, France}{} + \workshop{\at{Apr}{2012}} {invited} {ADEI for Tango} {Tango workshop, MAX-IV, Lund, Sweden}{} + \workshop{\at{Mar}{2012}} {} {Practical Experience with GPUs for high throughput computing} {HDRI/PanData workshop}{}%, Desy, Hamburg, Germany}{} + \workshop{\at{Mar}{2011}} {invited} {High Speed Tomography at KIT} {meeting on Tomographic reconstruction software, ESRF}{}%, Grenoble, France}{} + \workshop{\at{Sep}{2008}} {} {Advanced Data Extraction Infrastructure} {FORGES 2008 workshop, Nor-Amberd, Armenia}{} + + \eventsection{Seminars}{events} +% \seminar{\at{Nov}{2020}} {} {Cloud Technologies for Control Applications} {Insitute for Beam Physics and Technology, KIT, Germany}{} + \seminar{\at{May}{2020}} {} {Real-time reconstruction for synchrotron tomography} {CT lunch-and-learn session at University of Manchester, UK}{} +% \seminar{\at{Feb}{2019}} {} {WAVe: Accelerating Remote Visualization of Large Volumes} {YerPhI seminar, Armenia}{} + \seminar{\at{Feb}{2019}} {} {Cloud platform for high data rate detector instrumentation} {ASEC seminar, Armenia}{} + \seminar{\at{Oct}{2018}} {} {Balancing load of GPU subsystems to accelerate back projection for synchrotron tomography} {ESRF seminar, Grenoble, France}{} + \seminar{\at{Apr}{2016}} {} {ADEI: Intelligent visualization and management of time-series data in scientific experiments} {Instituto de Física, UNAM, Mexico}{} + \seminar{\at{May}{2015}} {} {Advanced Algorithms for Tomography} {YerPhI seminar, Yerevan, Armenia}{} +% \seminar{\at{Dez}{2013}} {} {ADEI: Advanced Data Extraction Infrastructure} {Steinbuch Centre for Computing, KIT, Germany}{} + \seminar{\at{Sep}{2013}} {} {Ultrafast X-Ray Imaging of Scientific Processe} {Shubnikov Crystallography Institute, Russia}{} + \seminar{\at{May}{2013}} {} {Ultrafast X-Ray Imaging of Scientific Processes} {Tomsk Polytechnic University, Russia}{} +% \seminar{\at{May}{2011}} {} {High Speed Tomography} {Institute for Synchrotron Radiation, KIT, Germany}{} +\end{events} diff --git a/section_research.tex b/section_research.tex new file mode 100644 index 0000000..359a1d6 --- /dev/null +++ b/section_research.tex @@ -0,0 +1,61 @@ +%\subtitle{Research and Technology}{\faSuitcase} +\subtitle{Research and development}{\faSuitcase} + +While the focus of my research is computing technolgies, the developed instrumentation enabled major scientific break-troughs achieved by KATRIN~\cite{katrin2019limit} and ASEC~\cite{chili2010thunderstorm} collaborations. +Bellow are referenced selected peer-reviewed publications which are either edited by me and my students or where we made a significant contribution. + +\begin{verycomplexevents} +% We don't list experiments which are handled torugh the software (with exceptions dedicated applications?), only direct impact. +% Skipped: +% buzmakov - just mentions UFO camera. overall not a high ranked paper. +% \subsectiontitle{Technology for the future data acquisition systems} + +% ?? make subsections with dates: \eventsection + + \datedeventsection{\since{2011}}{High-bandwidth data acquisition and data-driven control}{} +% \research {starting} {} {} {Adoption of}{high-performance and cloud computing for online data processing} + \research {\ivl{2018}{2019}} {PyHST} {} {Fine tunning}{tomographic reconstruction to evolving GPU architectures trough performance modelings~\cite{csa2020rtip}} + \research {\ivl{2016}{2017}} {} {CMS} {Participated}{in a case study on applications of GPUs in L1 track trigger for the next upgrade of CMS experiment~\cite{mohr2017cms}} + \technology {\ivl{2016}{2017}} {UFO} {KARA} {Designed}{a full chain of instrumentation for high-speed synchrotron imaging with online reconstruction and image-based feedback loop~\cite{kopmann2017ufo,stevanovic2015concert}} + \research {\ivl{2015}{2016}} {Alps} {KARA} {Researched}{low-latency communication mechanisms for data-driven control applications~\cite{vogelgesang2016dgma}} %dritschler2014using + \technology {\ivl{2014}{2015}} {Alps} {KARA} {Implemented}{fast DMA drivers with GPUDirect/DirectGMA support~\cite{rota2015dma}} + \research {\ivl{2013}{2014}} {UFO,PyHST} {KARA,ESRF} {Reviewed}{assymptotically fast methods of tomographic reconstruition suitable for GPU architectures~\cite{rshkarin2015}} + \research {\ivl{2011}{2013}} {UFO} {KARA} {Researched}{pipelined architectures for online processing of image-streams~\cite{vogelgesang2012ufo}} + \technology {\ivl{2011}{2013}} {Alps} {KARA} {Developed}{streaming data acquisition platform for scientific cameras (readout,debugging,storage)~\cite{caselle2013camera}}% readout framework, camera drivers, absraction, streaming storage, scripting & debugging + + \datedeventsection{\since{2007}}{Parallel architectures, performance analysis, and software optimization}{verycomplexevents} + \technology {\ivl{2020}{2021}} {CCPi} {UoM} {Applied}{methods of approximate computing to enable reconstruction of large datasets~\cite{ametova2021neutron}} + \research {\ivl{2017}{2018}} {PyHST} {} {Researched}{performance inbalances and hidden parallelism in GPU architectures~\cite{csa2018sbac}} % Balancing part is new, everything else was done earlier... + \technology {\ivl{2014}{2017}} {UFO} {KARA} {Investigated}{viable compromises between quality and parallelization capabilites of tomographic algorithms~\cite{ashkarin2015}} + \technology {\ivl{2013}{2014}} {UFO} {} {Developed}{parallel algorithms for uPIV (micro-particle velocimetry)~\cite{cavadini2018upiv}} + \technology {2010} {MRSES} {ASEC} {Leveraged}{PoweXCell architecture for MRSES feature selection algorithm [5000x speed-up]} + \technology {\ivl{2009}{2010}} {PyHST} {KARA,ESRF} {Optimized}{PyHST tomographic reconstruction framework~\cite{csa2011pyhst}} + \technology {\ivl{2009}{2010}} {DictHW} {} {Developed}{GPU implementation of digital image correlation and tracking algorithm [10x speed-up]} + \technology {\ivl{2007}{2008}} {XMLBench} {} {Carried out}{a performance study of open-source XML frameworks~\cite{csa2009xmlbench}} + + \datedeventsection{\since{1999}}{Digitization, data organization, and distributed control systems}{verycomplexevents} + \research {\since{2019}} {KaaS} {KATRIN} {Research}{cloud technologies for highly heterogeneous control systems in large-scale scientific experiments [expected]} % KATRIN paper to be added, ADEI-cloudificatin separated as stand-alone point + \research {\ivl{2015}{2017}} {WAVe} {KARA} {Researched}{remote visualization techniques for large and time-resolved tomographic volumes~\cite{ntj2017wave,losel2020biomedisa}} % Compression could be continuation of this (19/20) + \research {\ivl{2013}{2015}} {ADEI} {ASEC} {Researched}{emerging web technologies for management and visualization of terabyte-scale archives with time-series} % This is about ADEI2 attempts (but no publication) + \technology {\ivl{2011}{2014}} {ADEI} {ASEC} {Converted}{KATRIN data management system into a full flagged platform for time-series exploration and analysis} % ADEI analysis, etc. + \technology {\ivl{2008}{2010}} {ADEI} {KATRIN} {Developed}{data management components of KATRIN slow control system~\cite{csa2010adei}} % Lets assume it includes ADEI/Control + \technology {\ivl{2007}{2008}} {} {KATRIN} {Stabilized}{KATRIN slow control system for production use~\cite{katrin2015detector}} + \technology {\ivl{2005}{2006}} {ADAS} {ASEC} {Developed}{a distributed data acquisition system for particle detector networks~\cite{csa2009sevan}} + \research {\ivl{2002}{2004}} {ADAS} {ASEC,KATRIN} {Researched}{fast network protocols for heterogeneous slow control systems~\cite{eppler2004opc}} + \technology {\ivl{1999}{2001}} {} {} {Evaluated}{hardware-accelerated neural-networks for trigger applications~\cite{vardanyan2001sand}} +\end{verycomplexevents} + +% \research {\since{2020}} {Group - Application } +% \research {\ivl{2016}{2017}} {Group - Supervised a case study on use of GPUs in L1 track trigger for the next upgrade of CMS experiment~\cite{mohr2017cms}.} +% \technology {\ivl{2011}{2016}} {Participated in the development of streaming data acquisition platform aimed at control systems with image-based feedback loops and was responsible for the software part~\cite{caselle2013camera,rota2015dma}.} +% \technology {\ivl{2007}{2009}} {Developed data management components of KATRIN slow control system~\cite{katrin2015detector}.} +% \technology {\ivl{2005}{2007}} {Developed distributed DAQ system for particle detector networks~ +%\cite{csa2009sevan}.} +% \technology {\ivl{2002}{2005}} {Designed a high-performance extension for OPC XML-DA protocol aimed on slow control systems with high sampling rates.} +% \technology {\ivl{2020}{2021}} {Collaborated with scientists from University of Manchester on optimization of their tomography software: suggested methods of approximate computing to enable also reconstruction of large datasets~\cite{ametova2021neutron}.} +% \research {\ivl{2012}{2019}} {Analyzed major parallel architectures from AMD, NVIDIA, and Intel using micro-benchmarking techniques. Build a performance model of the back-projection algorithm and fine-tuned the parallel implementation for each architecture accordingly. The measured speed-ups over the state-of-the-art parallel solutions range from 2 to 7 times depending on the considered architecture. Mixed precission.} +% \technology {\ivl{2011}{2019}} {A new control-system for high-speed synchrotron imaging with online reconstruction and image-based feedback loop~\cite{kopmann2017ufo}} +% \research {\ivl{2013}{2017}} {With a group of 1 PhD and 2 Master students we have investigated iterative reconstruction algorithms to improve reconstruction of noisy or undersampled data. We searched for practical solutions providing viable balance between resulting quality and parallelization capabilities~\cite{ashkarin2015}. The selected algorithms were adapted for the GPU architecture and integrated into the UFO framework.} +% \research {\ivl{2013}{2015}} {Supervised a Master student researching methods of tomographic reconstruction which are both assymtotically faster than traditionally used \emph{Filtered Back Projection} and suitable for execution on GPU architectures~\cite{rshkarin2015}.} +% \research {\ivl{2011}{2014}} {With a group of 2 PhD and several Master students we developed a novel architecture for pipelined processing of image-streams which leveraged available parallelism in GPUs (and other massively parallel architectures) and was scaling across multiple GPUs and multi-GPU nodes automatically~\cite{vogelgesang2012ufo}.} +% \technology {\ivl{2009}{2010}} {Collaborated with researchers from ESRF facility on high-speed tomographic reconstruction and improved performance of PyHST software by factor of 30~\cite{csa2011pyhst}.} diff --git a/section_responsibilities.tex b/section_responsibilities.tex new file mode 100644 index 0000000..5469505 --- /dev/null +++ b/section_responsibilities.tex @@ -0,0 +1,31 @@ +\subtitle{Responsibilities}{\faTasks} +\begin{events} +% Skipped: +% - Panda ROCe/RDMA +% - Tango RDMA? But I was not really involved in this part... +% - Tango Archives at ANKA (not helpful and will be mentioned in the research/technology)... +% - SmartGrid (since 2016) + +% ? Mirroring ADEI data in EU/US? + +% \subsectiontitle{Current responsibilites} + \eventsection{Current}{} + \responsibility{\since{2018}} {Responsible for}{data management cloud at \refexp{KATRIN}} +% \responsibility{\since{2018}} {Responsible for}{virtualization services at \refuni{IPE}} + \responsibility{\since{2013}} {Responsible for}{data management system for \reffac{KIT Batery Technology Center}} + \responsibility{\since{2011}} {Responsible for}{software stack of \refproj{UFO} data acquisition platform}% including UFO Camera and KAPTURE/KALYPSO detectors} + \responsibility{\since{2007}} {Responsible for}{slow control system at \refexp{KATRIN}} + +% \subsectiontitle{Prior responsibilites: Digitization, data organization, and distributed control systems} + \eventsection{Past}{events} + \responsibility{\ivl{2017}{2018}} {Responsible for}{transfer of \refproj{UFO} Camera technology to \reffac{HZG}} % for operation at \reffac{IBL} and \reffac{HEMS} beamlines at \reffac{PETRA-3} synchrotron} + \responsibility{\ivl{2010}{2017}} {Responsible for}{parallel computing cluster for \refproj{UFO} project} + \responsibility{\ivl{2013}{2016}} {Responsible for}{technology transfer to \refexp{ASEC} and \refexp{SEVAN} experiments} + \responsibility{\ivl{2009}{2015}} {Responsible for}{data portal for \refexp{KIT Cube} experiment and \reffac{KIT Weather Tower}} + \responsibility{\ivl{2008}{2014}} {Responsible for}{maintenace and optimization of a \reffac{KARA} branch of \refsoft{PyHST}} + \responsibility{\ivl{2008}{2014}} {Responsible for}{data management system at \reffac{TOSKA} and \reffac{CULTKA} facilities} + \responsibility{\ivl{2007}{2009}} {Responsible for}{integration of \refexp{KATRIN} components in centralized control system} + \responsibility{\ivl{2005}{2007}} {Responsible for}{data acquisition and data management at \refexp{ASEC} and \refexp{SEVAN}} + \responsibility{\ivl{2003}{2005}} {Responsible for}{intercommunication between \refexp{KATRIN} DAQ and NI fieldpoint devices} + \responsibility{\ivl{2001}{2002}} {Responsible for}{IT infrastructure of \refexp{ASEC}} +\end{events} diff --git a/section_skills.tex b/section_skills.tex new file mode 100644 index 0000000..064a5f1 --- /dev/null +++ b/section_skills.tex @@ -0,0 +1,11 @@ +\subtitle{Technical skills}{\faTasks} + +\begin{categories} + \category{Programming}{C/C++, IPC, TCP/IP, CUDA/OpenCL, SSE/AltiVec, OpenMP/NPTL} + \category{System Programming}{POSIX, Linux Internals, PCI Drivers, DMA, GPUDirect/DirectGMA} + \category{Networking}{Ethernet/Infiniband, Sockets/MPI/0MQ, RDMA (ROCe), LibVMA} + \category{Software Analysis}{gdb, perf/operf, nvvp/nvprof, vtune, valgrind, systap, tcpdump} + \category{Scientific Computing}{MATLAB, Python/SciPy, ROOT, BLAS/LAPACK} + \category{Data Management}{Brokers, Databases (SQL/NOSQL), XML \& Co, Web Development} + \category{Orchestration}{Ansible, OpenShift, Docker, LibVirt/KVM, Infiniband, GlusterFS} +\end{categories} diff --git a/section_software.tex b/section_software.tex new file mode 100644 index 0000000..d5617da --- /dev/null +++ b/section_software.tex @@ -0,0 +1,39 @@ +\subtitle{Scientific and open-source software}{\faSuitcase} +%\renewcommand{\labelitemi}{$\bullet$} + +\begin{complexevents} + \eventsection{Maintain}{} %{Projects I currently maintain}{} + \software {\since{2018}} {KaaS} {ands.suren.me} {KATRIN} % batteries + {Developed a}{Katrin-as-a-Service data management platform for KATRIN}{} + \software {\since{2015}} {Bora} {bora.suren.me} {KATRIN} + {Supervised and currently maintain a}{monitoring framework for ADEI ecosystem}{} + \software {\since{2011}} {Alps} {alps.suren.me} {Camera at HZG, Camera at SCI, Kapture/Kalypso at KARA} + {Developed a}{Linux driver platform for fast prototyping of PCIe-based electronics}{} %{with flexible register model with scripting support, modular scatter-gather DMA engines, and low-latency RDMA communication with GPUs} + \software {\since{2008}} {ADEI} {adei.info} {KATRIN, KARA, ASEC, BESS, KIT Tower, KIT Cube, TOSKA} + {Developed a}{cloud platform for visualization and analysis of time-series}{} + \software {\since{2005}} {ADAS} {adas.suren.me} {ASEC} + {Developed a}{data acquistion system for ASEC detectors}{} + \software {\since{2003}} {RusXMMS} {rusxmms.sf.net} {RedHat, OpenSuSE, Debian, Ubuntu, Arch, FreeBSD} + {Developed a}{operations with multilangual strings in non-unicode encodings}{} %{collection of language and encoding detection libraries to simplify operations with collections of multilingual strings encoded in old non-Unicode formats (e.g. file names, metadata in music files, etc.)}{} + + \eventsection{Supervised and coordinated}{complexevents} %{Projects I have supervised and coordinated}{complexevents} + \software {\ivl{2015}{2018}} {WAVe} {wave.suren.me} {} + {Supervised development of a}{JavaScript volume rendering library based on WebGL}{supervised} + \software {\ivl{2012}{2017}} {UFO} {ufo-kit.github.io} {KARA} + {Coordinated development of a}{pipelined image-processing framework and a collection of GPU-accelerated algorithms}{coordinated} + + \eventsection{Contributions}{complexevents} + \software {\ivl{2020}{2021}} {CCPi} {www.ccpi.ac.uk} {} + {Contributed performance optimizations for regularization toolkit in}{Tomographic Imaging Project}{performance optimizations}%{for regularization toolkit} + \software {\ivl{2008}{2014}} {PyHST} {pyhst2.suren.me} {KARA, ESRF} + {Optimized}{\reffac{ESRF} tomography software}{DFI algorithm and performance improvements} + + \eventsection{Obsolete}{complexevents} + \obsolete {\ivl{2010}{2011}} {MRSES} {mrses.suren.me} {} + {Implemented a}{feature selection algorithm for Intel and PowerXCell architetures}{} + \obsolete {\ivl{2009}{2010}} {DictHW} {dicthw.suren.me} {} + {Developed}{CUDA implementation of digital image tracking algorithm}{} + \obsolete {\ivl{2003}{2009}} {XMLBench} {xmlbench.sourceforge.net} {} + {Developed}{XML Benchmarking suite}{} + +\end{complexevents} diff --git a/section_supervision.tex b/section_supervision.tex new file mode 100644 index 0000000..32b01da --- /dev/null +++ b/section_supervision.tex @@ -0,0 +1,20 @@ +\subtitle{Supervision and teaching}{\faTasks} +\begin{events} + \eventsection{PhD}{} + \supervision {\since{2020}} {Proposed and supervise}{2 PhD projects on adoption of cloud technologies for data acquisition and slow control systems} + \supervision {\ivl{2014}{2018}} {Co-supervised}{PhD thesis “Big Data Management and Visualisation”} + \supervision {\ivl{2013}{2017}} {Co-supervised}{PhD student working on low-latency communication protocols for distributed data acquisition systems} + \supervision {\ivl{2011}{2016}} {Co-supervised}{PhD thesis “An Extensible Parallel Computing Framework for Ultra-Fast X-Ray Imaging”} + + \eventsection{Students}{events} + \supervision {\ivl{2014}{2018}} {Supervised}{5 master theses on remote visualization of archives with tomopgraphic data} + \supervision {\ivl{2013}{2017}} {Supervised}{4 students working on fast DMA interconnects between FPGA and GPUs} + \supervision {\ivl{2011}{2016}} {Supervised}{6 theses on advanced algoritms in tomographic reconstruction} + \supervision {\ivl{2010}{2015}} {Supervised}{10 internships on web technologies for visualization of time series} + \supervision {2014} {Supervised}{2 master theses on GPU-accelerated algorithms for nano-particle tracking} + + \eventsection{Courses and seminars}{events} + \teaching {2019} {}{GPU computing tutorial at ARBRA summer school in Nor-Amberd, Armenia} + \teaching {\ivl{2014}{2017}} {Supervised}{4 student topics at seminar "Advanced topics in Parallel Programming"}% (organized by Prof. Achim Streit)} + \teaching {2013} {}{GPU computing tutorial at KSETA graduate school at KIT} +\end{events} diff --git a/xetex-inputenc.sty b/xetex-inputenc.sty new file mode 100644 index 0000000..e595283 --- /dev/null +++ b/xetex-inputenc.sty @@ -0,0 +1,83 @@ +%% +%% This is file `xetex-inputenc.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% xetex-inputenc.dtx (with options: `package') +%% +%% ___________________________________ +%% The xetex-inputenc override package +%% (C) 2009 Will Robertson +%% License information appended +%% +%% +\ProvidesPackage{xetex-inputenc} + [2009/03/09 v0.2 XeTeX-specific inputenc package] +\def\xIE@encoding#1#2{% + \DeclareOption{#1}{% + \xIE@set{#2} + }% +} +\DeclareOption*{% + \PackageWarning{xetex-inputenc}{% + Encoding "\CurrentOption" not recognised; attempting to use it anyway + }% + \xIE@set{\CurrentOption}% +} +\newcommand\xIE@set[1]{% + \edef\xetex@inputenc{#1}% + \AtEndOfPackage{% + \XeTeXinputencoding "\xetex@inputenc" + \XeTeXdefaultencoding "\xetex@inputenc" + } +} +\xIE@encoding{ascii} {ascii} +\xIE@encoding{latin1} {latin1} +\xIE@encoding{latin2} {latin2} +\xIE@encoding{latin3} {latin3} +\xIE@encoding{latin4} {latin4} +\xIE@encoding{latin5} {latin5} +\xIE@encoding{latin9} {latin9} +\xIE@encoding{latin10} {latin10} +\xIE@encoding{decmulti} {dec} +\xIE@encoding{cp850} {cp850} +\xIE@encoding{cp852} {cp852} +\xIE@encoding{cp858} {cp858} +\xIE@encoding{cp437} {cp437} +\xIE@encoding{cp865} {cp865} +\xIE@encoding{applemac} {mac} +\xIE@encoding{cp1250} {windows-1250} +\xIE@encoding{cp1252} {windows-1252} +\xIE@encoding{cp1257} {windows-1257} +\xIE@encoding{ansinew} {windows-1252} +\xIE@encoding{utf8} {utf8} +\ExecuteOptions{utf8} +\ProcessOptions +\def\@input#1{% + \IfFileExists{#1}{% + \XeTeXdefaultencoding "utf8" + \@@input\@filef@und + \XeTeXdefaultencoding "\xetex@inputenc" + }{\typeout{No file #1.}}% +} +\AtBeginDocument{% + \immediate\write\@auxout{\string\XeTeXinputencoding "utf8"}% +} +%% +%% Copyright (C) 2009 by Will Robertson <wspr81@gmail.com> +%% +%% Distributable under the LaTeX Project Public License, +%% version 1.3c or higher (your choice). The latest version of +%% this license is at: http://www.latex-project.org/lppl.txt +%% +%% This work is "maintained" (as per LPPL maintenance status) +%% by Will Robertson. +%% +%% This work consists of the file xetex-inputenc.dtx +%% and the derived files xetex-inputenc.sty, +%% xetex-inputenc.ins, and +%% xetex-inputenc.pdf. +%% +%% +%% End of file `xetex-inputenc.sty'. diff --git a/yaac-another-awesome-cv.cls b/yaac-another-awesome-cv.cls index a711e4d..bcc4aa8 100755..120000 --- a/yaac-another-awesome-cv.cls +++ b/yaac-another-awesome-cv.cls @@ -1,541 +1 @@ -%% Copyright 2016 Christophe Roger -% -% Author: -% Christophe Roger (Darwiin) -% -% This work may be distributed and/or modified under the -% conditions of the LaTeX Project Public License, either version 1.3c -% of this license or (at your option) any later version. -% The latest version of this license is in -% http://www.latex-project.org/lppl.txt -% and version 1.3 or later is part of all distributions of LaTeX -% version 2005/12/01 or later. -% -% This work has the LPPL maintenance status `maintained'. -% -% The Current Maintainer of this work is M. C. Roger. -% -% This work consists of the files awesome-source-cv.cls - -\ProvidesClass{yaac-another-awesome-cv}[2020/03/24 v2.2.1 'YAAC: Another Awesome CV' Class] - -\def\@@ptsize{10pt} - -\DeclareOption{10pt}{\def\@@ptsize{10pt}} -\DeclareOption{11pt}{\def\@@ptsize{11pt}} -\DeclareOption{12pt}{\def\@@ptsize{12pt}} - -\ProcessOptions\relax - -\LoadClass[a4paper,\@@ptsize]{article} - -\newif\if@showLinks \@showLinksfalse -\newif\if@isCompact \@isCompactfalse - -\DeclareOption{green}{ - \def\@green{green} -} - -\DeclareOption{red}{ - \def\@red{red} -} - -\DeclareOption{indigo}{ - \def\@indigo{indigo} -} -\DeclareOption{orange}{ - \def\@orange{orange} -} - -\DeclareOption{monochrome}{ - \def\@monochrome{monochrome} -} - -\DeclareOption{localFont}{ - \def\@local{local} -} - -\DeclareOption{alternative}{ - \def\@alternative{alternate} -} - -\DeclareOption{showLinks}{ \@showLinkstrue} -\DeclareOption{compact}{ \@isCompacttrue} - -\ProcessOptions - -% Dependences -%A Few Useful Packages -\RequirePackage[english,french]{babel} -\RequirePackage[utf8]{luainputenc} -\RequirePackage{fontspec} % for loading fonts -\RequirePackage{url,parskip} % other packages for formatting -\RequirePackage[usenames,dvipsnames]{xcolor} -\RequirePackage{fullpage} -\RequirePackage[margin=1.5cm]{geometry} -\RequirePackage[fixed]{fontawesome5} -\RequirePackage{hyperref} -\RequirePackage{titlesec} -\RequirePackage{array} -\RequirePackage{enumitem} -\RequirePackage{longtable} -\RequirePackage{etoolbox} -\RequirePackage{tikz} -\RequirePackage[skins]{tcolorbox} -\RequirePackage{fancyhdr} -\RequirePackage{ifthen} - - -\DeclareUnicodeCharacter{00E9}{\'{e}} -% Define default accent colors -\definecolor{basecolor}{HTML}{000066} %BLUE - -\ifundef{\@green} { - \ifundef{\@red} { - \ifundef{\@indigo}{ - \ifundef{\@orange} { - \ifundef{\@monochrome} {} - { \definecolor{basecolor}{HTML}{000000}} - } - { \definecolor{basecolor}{HTML}{e68a00} } - } - { \definecolor{basecolor}{rgb}{0.2, 0.07, 0.48} } - } - { \definecolor{basecolor}{HTML}{b30000} } %RED -} -{ \definecolor{basecolor}{rgb}{0.0, 0.62, 0.38} } - -\definecolor{darkGrey}{HTML}{989898} - -\colorlet{linkcolor}{basecolor} -\colorlet{accentcolor}{linkcolor!90} -\colorlet{symbolcolor}{linkcolor!85} - -% Setup hyperref package, and colours for links -%\definecolor{linkcolour}{rgb}{0,0.2,0.6} - -\if@showLinks - \hypersetup{% - breaklinks - }% -\else - \hypersetup{% - pdfborder = {0 0 0}, - breaklinks - }% -\fi - -% Setup fancyhdr package -\fancyhf{} -\fancyhfoffset{0em} -% Remove head rule -\renewcommand{\headrulewidth}{0pt} -%\fancyfoot[C]{\thepage} -\pagestyle{fancy} - -%\pagestyle{empty} % non-numbered pages -%\font\fb=''[cmr10]'' % for use with \LaTeX command - -% Setup CV sections -\titleformat{\section}{\Large\raggedright}{}{0em}{}[\titlerule] -\titlespacing{\section}{0pt}{2pt}{2pt} - -% Configure list -\setlist[itemize,1]{label=\faAngleRight, nosep, leftmargin=2em} -\setlist[itemize,2]{label=\faAngleRight, nosep, leftmargin=1.5em} - -% Setup Array : new column type -\newcolumntype{R}[1]{>{\hfill}m{#1}} - -%Italian hyphenation for the word: ''corporations'' -\hyphenation{im-pre-se} - -% Setup fonts -\defaultfontfeatures{Mapping=tex-text} -% - -% Define font to use according to localFont option -\ifundef{\@local} -{ - %\setmainfont[BoldFont = Helvetica Neue, ItalicFont=Helvetica Neue Thin Italic ,SmallCapsFont = Helvetica Neue Light]{Helvetica Neue Thin} - \setmainfont{Source Sans Pro Light}[ - BoldFont = SourceSansPro-Regular, - ItalicFont= Source Sans Pro Light Italic] -} -{ - \setmainfont{SourceSansPro-Light}[ - Path = fonts/, - BoldFont = SourceSansPro-Regular, - ItalicFont = SourceSansPro-LightIt] -} - -%New length definition -\newlength{\fulllength} -\setlength{\fulllength}{17.8cm} - -\newlength{\leftcolumnlength} -\setlength{\leftcolumnlength}{2.5cm} - -\newlength{\rightcolumnlength} -%\setlength{\rightcolumnlength}{15.3cm minus 1cm} -%\setlength{\rightcolumnlength}{\dimexpr(\fulllength-\leftcolumnlength)\relax} -\setlength{\rightcolumnlength}{\dimexpr(\fulllength-\leftcolumnlength)\relax} - -% Override default left column length of (2.5cm) -% Usage: \setleftcolumnlength{<length>} -\newcommand{\setleftcolumnlength}[1]{ - \setlength{\leftcolumnlength}{#1} - \setlength{\rightcolumnlength}{\dimexpr(\fulllength-\leftcolumnlength)\relax} -} - -% Font Awesome icons aliases -\newcommand{\mailSymbol}{\faAt} -\newcommand{\locationSymbol}{\faMapMarker*} -\newcommand{\infoSymbol}{\faInfo} -\newcommand{\linkedinSymbol}{\faLinkedinIn} -\newcommand{\viadeoSymbol}{\faViadeo} -\newcommand{\mobileSymbol}{\faMobile*} -\newcommand{\githubSymbol}{\faGithub} -\newcommand{\stackoverflowSymbol}{\faStackOverflow} -\newcommand{\stackexchangeSymbol}{\faStackExchange} -\newcommand{\mediumSymbol}{\faMedium} -\newcommand{\bitbucketSymbol}{\faBitbucket} -\newcommand{\websiteSymbol}{\faLink} - - -\newcommand\link[2]{\color{linkcolor}\href{#1}{#2}\color{Black} } -\newcommand\important[1]{\textbf #1} - -% Create a tag -% Usage: \cvtag{<tag label>} -\newcommand{\cvtag}[1]{% - \tikz[baseline]\node[anchor=base,draw=darkGrey!70,rounded corners=0.5ex,inner xsep=1ex,inner ysep =0.55ex,text height=1.3ex,text depth=.25ex]{#1}; -} - -% Render author's name -% Usage: \user{<firstanme>}{<lastname>} -\newcommand\user[2]{\color{accentcolor}{\LARGE #1 \textsc{\textbf{#2}}}\color{Black}} - -% Render a text with its symbol -% Usage; \socialtext{<icon>}{<label>} -\newcommand{\socialtext}[2]{\mbox{\textcolor{symbolcolor}{#1}#2\hspace{0.8em}}} - -% Render a link with its symbol -% Usage; \sociallink{<icon>}{<label>} -\newcommand{\sociallink}[3]{\mbox{\textcolor{symbolcolor}{#1}\link{#2}{#3}\hspace{0.8em}}} - -% Define author's name -% Usage: \name{<firstname>}{<lastname>} -% Usage: \firstname{<firstname>} -% Usage: \lastname{<lastname>} -% Usage: \familyname{<familyname>} -\newcommand*{\name}[2]{\def\@firstname{#1}\def\@lastname{#2}} -\newcommand*{\firstname}[1]{\def\@firstname{#1}} -\newcommand*{\lastname}[1]{\def\@lastname{#1}} -\newcommand*{\familyname}[1]{\def\@lastname{#1}} -\def\@familyname{\@lastname} - -% Define author's tagline -% Usage: \tagline{<tag line>} -\newcommand*{\tagline}[1]{\def\@tagline{#1}} - -% Define author's photo -% Usage: \photo[<shape: circular, square, roundedsquare, squircle>]{<diameter>}{<photo>} -% The shape of the author's photo is circular by default. -\newcommand{\photo}[3][circular]{\def\@photo{#3}\def\@photodiameter{#2}\def\@photoshape{#1}} - -% Render author's address -% Usage: \address{<address>} -\newcommand*{\address}[1]{\socialtext{\locationSymbol}{#1}} - -% Render author's infos -% Usage: \infos{<infos>} -\newcommand*{\infos}[1]{\socialtext{\infoSymbol}{#1}} - -% Render author's linked-in (optional) -% Usage: \linkedin{<linked-in-nick>} -\newcommand*{\linkedin}[1]{\sociallink{\linkedinSymbol}{http://www.linkedin.com/in/#1/fr}{linkedin.com/in/#1}} - -% Render author's viadeo(optional) -% Usage: \viadeo{<viadeo-nick>} -\newcommand*{\viadeo}[1]{\sociallink{\viadeoSymbol}{http://www.viadeo.com/fr/profile/#1}{viadeo.com/fr/profile/#1}} - -% Render author's github (optional) -% Usage: \github{<github-nick>} -\newcommand*{\github}[1]{\sociallink{\githubSymbol}{https://www.github.com/#1}{github.com/#1}} % Github icon + URL - -% Render author's stackoverflow profile (optional) -% Usage: \stackoverflow{<stackoverflow-user-id>} -\newcommand*{\stackoverflow}[1]{\sociallink{\stackoverflowSymbol}{https://www.stackoverflow.com/u/#1}{stackoverflow.com/u/#1}} - -% Render author's stackexchange profile (optional) -% Usage: \stackexchange{<stackexchange-user-id>} -\newcommand*{\stackexchange}[1]{\sociallink{\stackexchangeSymbol}{https://stackexchange.com/users/#1}{stackexchange.com/users/#1}} - -% Render author's medium (optional) -% Usage: \medium{<medium-nick>} -\newcommand*{\medium}[1]{\sociallink{\mediumSymbol}{https://www.medium.com/@#1}{medium.com/#1}} - -% Render author's bitbucket (optional) -% Usage: \bitbucket{<bitbucket-account-name>} -\newcommand*{\bitbucket}[1]{\sociallink{\bitbucketSymbol}{https://bitbucket.com/#1}{bitbucket.com/#1}} - -% Render author's email (optional) -% Usage: \email{<email adress>} -\newcommand*{\email}[1]{\sociallink{\mailSymbol}{mailto:#1}{#1}} - -% Render a website link (optional) -% Usage: \website{<website name>}{<website adress>} -\newcommand*{\website}[2]{\sociallink{\websiteSymbol}{#1}{#2}} - -% Render author's mobile phone (optional) -% Usage: \smartphone{<mobile phone number>} -\newcommand*\smartphone[1]{\socialtext{\mobileSymbol}{#1}} - -% Render author's tagline -\newcommand\resumetitle[1]{ - \ifundef{\@alternative}{ - \par{ - \bigskip\center{\Large \color{accentcolor}\textbf{#1}\color{Black}}\par - } - \bigskip - }{ - \color{accentcolor}\textbf{\large{#1}}\color{black} - } -} - -\newcommand\idphoto{ - \ifthenelse{\equal{\@photoshape}{square}}{ - % Draw square photo - \tikz\path[fill overzoom image={\@photo}]rectangle(\linewidth,\linewidth); - }{ - \ifthenelse{\equal{\@photoshape}{roundedsquare}}{ - % Draw square photo with rounded corners - \tikz\path[fill overzoom image={\@photo}][rounded corners=2mm]rectangle(\linewidth,\linewidth); - }{ - \ifthenelse{\equal{\@photoshape}{squircle}}{ - % Draw squircle photo - \tikz\path[fill overzoom image={\@photo}][rounded corners=8mm]rectangle(\linewidth,\linewidth); - }{ - % Draw circular photo - \tikz\path[fill overzoom image={\@photo}]circle[radius=0.5\linewidth]; - } - } - - } -} - -% Define social entries to print in header -\newcommand{\socialinfo}[1]{\def\@socialinfo{#1}} - -% Render CV header -% Needs \@firstname, \@lastname and \@tagline to be defined -\newcommand*{\makecvheader}{ - \ifundef{\@alternative}{ - \ifundef{\@photodiameter}{ - \begin{minipage}{\linewidth} - }{ - \begin{minipage}{\dimexpr\linewidth-\@photodiameter-2em} - } - \color{accentcolor}\user{\@firstname}{\@lastname}\color{black}\\ - \small{\@socialinfo} - \end{minipage} - \ifdef{\@photodiameter}{ - \begin{minipage}{\@photodiameter} - \idphoto - \end{minipage} - }{} - \resumetitle{\@tagline} - }{ - \ifundef{\@photodiameter}{ - \begin{minipage}{\linewidth} - }{ - \begin{minipage}{\dimexpr\linewidth-\@photodiameter-2em} - } - \user{\@firstname}{\@lastname}\\ - \resumetitle{\@tagline} - \smallskip\\ - \small{\@socialinfo} - \end{minipage} - \ifdef{\@photodiameter}{ - \begin{minipage}{\@photodiameter} - \idphoto - \end{minipage} - }{} - \bigskip - } -} - -% Define a footer for CV -% Usage: \makecvfooter{<left>}{<center>}{<right>} -\newcommand*{\makecvfooter}[3]{% - \fancyfoot{} - \fancyfoot[L]{#1} - \fancyfoot[C]{#2} - \fancyfoot[R]{#3} -} - -% Resume part title definition -\newcommand\sectionTitle[2]{\section{\texorpdfstring{\color{accentcolor}#2\enspace \textsc{#1}}{#1}}} - -% Define the 'keywords' environment -\newenvironment{keywords}{% - \renewcommand{\arraystretch}{1.1} - - \begin{tabular}{>{}r>{}p{13cm}} -}{% - \end{tabular} -} - -% Render a scholarshipentry in the scolarship environment -% Usage: \scholarshipentry{<date>}{<description>} -\newcommand\keywordsentry[2]{ - \textbf{#1} & #2\\ -} - -% Define a new column type for the scholarship environment -\newcolumntype{Y}{>{\raggedleft}p{\leftcolumnlength}} - -% Define the 'scholarship' environment -\newenvironment{scholarship}{% - \begin{tabular}{Y p{\rightcolumnlength}} -}{% - \end{tabular} -} - -% Render a scholarshipentry in the scolarship environment -% Usage: \scholarshipentry{<date>}{<description>} -\newcommand\scholarshipentry[2]{ - #1 & #2 \\ -} - -% Define the 'skills' environment -\newenvironment{skills}{% - \begin{longtable}{R{\leftcolumnlength}p{\rightcolumnlength}} -}{% - \end{longtable} -} - -% Render a skill in the skills environment -% Usage: \skill{<skill>}{<level>} -\newcommand\skill[2]{ - \textbf{#1} & \foreach \x in {1,...,5}{{\color{accentcolor!80} \ifnumgreater{\x}{#2}{\faCircle[regular]}{\faCircle}}\enspace } \\ -} - -\newcolumntype{E}{>{\raggedright\arraybackslash}p{\rightcolumnlength}} - -% Define the 'experiences' environment -\newenvironment{experiences}{% - \begin{longtable}{R{\leftcolumnlength}|E} -}{% - \end{longtable} -} - -% Render an experience in the experiences environment -% Usage: -% \experience -% {<End date>} {<Title>}{<Enterprise>}{<Country>} -% {<Start date} { -% <Experience description (Could be a list)> -% } -% {<Technology list>} -\newcommand\experience[7]{ - \textbf{#1} & \textbf{#2, \textsc{#3}, #4} \\* - \textbf{#5} & \begin{minipage}[t]{\rightcolumnlength} - #6 - \end{minipage} \\* - & \footnotesize{\foreach \n in {#7}{\cvtag{\n}}} \\ - } - -% Render a consultant experience in the experiences environment -% Usage: -% \consultantexperience -% {<End date>} {<Consultant title>}{<Consulting Enterprise>}{<Country>} -% {<Start date} {<Client title>}{<Client business unit>} -% { -% <Experience description (Could be a list)> -% } -% {<Technology list>} -\newcommand\consultantexperience[9]{ - \textbf{#1} & \textbf{#2, \textsc{#3}, #4} \\* - \textbf{#5} & \emph{#6} pour \textsc{#7} \\* - & \begin{minipage}[t]{\rightcolumnlength} - #8 - \end{minipage} \\* - & \footnotesize{\foreach \n in {#9}{\cvtag{\n}}} \\ - } - -% Define the empty separator macro with different spacing according to document class option 'compact' -\if@isCompact - \newcommand\emptySeparator{\multicolumn{2}{c}{}\\[-0.6em]} -\else - \newcommand\emptySeparator{\multicolumn{2}{c}{}\\} -\fi - - - -% Define the 'projects' environment -\newenvironment{projects}{% - \begin{longtable}{l} -}{% - \end{longtable} -} - -% Define the 'project' entry in the 'projects' environment -% Usage: -% \project -% {<Project name>}{<dates>} -% {<link1> <link2>} -% {<Project description>} -% {<techno1>,<techno2>} -\newcommand\project[5]{ - \begin{minipage}[t]{\dimexpr(\linewidth) - 1.5em} - \textbf{\textsc{#1}} \hfill \textsc{#2}\smallskip\\ - #3\\ - #4\smallskip\\ - \footnotesize{\foreach \n in {#5}{\cvtag{\n}}}\\ - \end{minipage} - \\* -} - - -\newcommand*\twocolumnsection[2]{ - \begin{minipage}[t]{\dimexpr(\linewidth/2) - 3em} - #1 - \end{minipage} - \hfill - \begin{minipage}[t]{\dimexpr(\linewidth/2) - 3em} - #2 - \end{minipage} - } - -% Define the 'referencees' environment -\newenvironment{referees}{% -}{% - \hfill - \bigskip -} - -\newcommand*\referee[5]{ - \hspace{1em} - \begin{minipage}[t]{\dimexpr(\linewidth/3) - 3em} - \begin{tabular}{>{}l >{}l} - \multicolumn{2}{l}{\textbf{#1}}\\ - \multicolumn{2}{l}{\emph{#2}, \textsc{#3}}\\ - \quad \mailSymbol & \href{mailto:#4}{#4} \\ - \quad \faPhone & #5 \\ - \end{tabular} - \end{minipage}% - } - -\newcommand*\refereeMailOnly[4]{ - \hspace{1em} - \begin{minipage}[t]{\dimexpr(\linewidth/3) - 3em} - \begin{tabular}{>{}l >{}l} - \multicolumn{2}{l}{\textbf{#1}}\\ - \multicolumn{2}{l}{\emph{#2}, \textsc{#3}}\\ - \quad \mailSymbol & \href{mailto:#4}{#4} \\ - \end{tabular} - \end{minipage}% -} - +yaac-another-awesome-cv/yaac-another-awesome-cv.cls
\ No newline at end of file diff --git a/LICENSE b/yaac-another-awesome-cv/LICENSE index 4db9b5a..4db9b5a 100755 --- a/LICENSE +++ b/yaac-another-awesome-cv/LICENSE diff --git a/PULL_REQUEST_TEMPLATE.md b/yaac-another-awesome-cv/PULL_REQUEST_TEMPLATE.md index 65a3c17..65a3c17 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/yaac-another-awesome-cv/PULL_REQUEST_TEMPLATE.md diff --git a/README.md b/yaac-another-awesome-cv/README.md index 1627628..1627628 100755 --- a/README.md +++ b/yaac-another-awesome-cv/README.md diff --git a/example/cr.png b/yaac-another-awesome-cv/example/cr.png Binary files differindex 2601ea9..2601ea9 100644 --- a/example/cr.png +++ b/yaac-another-awesome-cv/example/cr.png diff --git a/example/cv.bcf b/yaac-another-awesome-cv/example/cv.bcf index 93892db..93892db 100644 --- a/example/cv.bcf +++ b/yaac-another-awesome-cv/example/cv.bcf diff --git a/example/cv.run.xml b/yaac-another-awesome-cv/example/cv.run.xml index 082eb10..082eb10 100644 --- a/example/cv.run.xml +++ b/yaac-another-awesome-cv/example/cv.run.xml diff --git a/example/cv.tex b/yaac-another-awesome-cv/example/cv.tex index 8ec1164..8ec1164 100755 --- a/example/cv.tex +++ b/yaac-another-awesome-cv/example/cv.tex diff --git a/example/darwiin.png b/yaac-another-awesome-cv/example/darwiin.png Binary files differindex 22ae9ab..22ae9ab 100644 --- a/example/darwiin.png +++ b/yaac-another-awesome-cv/example/darwiin.png diff --git a/example/fonts b/yaac-another-awesome-cv/example/fonts index 35bed8b..35bed8b 120000 --- a/example/fonts +++ b/yaac-another-awesome-cv/example/fonts diff --git a/example/preview/cv1-alternative.jpeg b/yaac-another-awesome-cv/example/preview/cv1-alternative.jpeg Binary files differindex e90bd33..e90bd33 100644 --- a/example/preview/cv1-alternative.jpeg +++ b/yaac-another-awesome-cv/example/preview/cv1-alternative.jpeg diff --git a/example/preview/cv1.jpeg b/yaac-another-awesome-cv/example/preview/cv1.jpeg Binary files differindex f202b88..f202b88 100644 --- a/example/preview/cv1.jpeg +++ b/yaac-another-awesome-cv/example/preview/cv1.jpeg diff --git a/example/preview/cv2-alternative.jpeg b/yaac-another-awesome-cv/example/preview/cv2-alternative.jpeg Binary files differindex e8cec95..e8cec95 100644 --- a/example/preview/cv2-alternative.jpeg +++ b/yaac-another-awesome-cv/example/preview/cv2-alternative.jpeg diff --git a/example/preview/cv2.jpeg b/yaac-another-awesome-cv/example/preview/cv2.jpeg Binary files differindex 8f84e94..8f84e94 100644 --- a/example/preview/cv2.jpeg +++ b/yaac-another-awesome-cv/example/preview/cv2.jpeg diff --git a/example/sample.bib b/yaac-another-awesome-cv/example/sample.bib index ada69a7..ada69a7 100644 --- a/example/sample.bib +++ b/yaac-another-awesome-cv/example/sample.bib diff --git a/example/section_competences.tex b/yaac-another-awesome-cv/example/section_competences.tex index af3bf7b..af3bf7b 100755 --- a/example/section_competences.tex +++ b/yaac-another-awesome-cv/example/section_competences.tex diff --git a/example/section_experience.tex b/yaac-another-awesome-cv/example/section_experience.tex index bb56186..bb56186 100755 --- a/example/section_experience.tex +++ b/yaac-another-awesome-cv/example/section_experience.tex diff --git a/example/section_experience_short.tex b/yaac-another-awesome-cv/example/section_experience_short.tex index c57f591..c57f591 100755 --- a/example/section_experience_short.tex +++ b/yaac-another-awesome-cv/example/section_experience_short.tex diff --git a/example/section_headline.tex b/yaac-another-awesome-cv/example/section_headline.tex index 668f53a..668f53a 100755 --- a/example/section_headline.tex +++ b/yaac-another-awesome-cv/example/section_headline.tex diff --git a/example/section_headline_archi.tex b/yaac-another-awesome-cv/example/section_headline_archi.tex index 2d3e5d9..2d3e5d9 100644 --- a/example/section_headline_archi.tex +++ b/yaac-another-awesome-cv/example/section_headline_archi.tex diff --git a/example/section_interets.tex b/yaac-another-awesome-cv/example/section_interets.tex index 8363557..8363557 100755 --- a/example/section_interets.tex +++ b/yaac-another-awesome-cv/example/section_interets.tex diff --git a/example/section_langues.tex b/yaac-another-awesome-cv/example/section_langues.tex index 6a817f2..6a817f2 100755 --- a/example/section_langues.tex +++ b/yaac-another-awesome-cv/example/section_langues.tex diff --git a/example/section_projets.tex b/yaac-another-awesome-cv/example/section_projets.tex index fff1904..fff1904 100644 --- a/example/section_projets.tex +++ b/yaac-another-awesome-cv/example/section_projets.tex diff --git a/example/section_references.tex b/yaac-another-awesome-cv/example/section_references.tex index 367caa9..367caa9 100755 --- a/example/section_references.tex +++ b/yaac-another-awesome-cv/example/section_references.tex diff --git a/example/section_scolarite.tex b/yaac-another-awesome-cv/example/section_scolarite.tex index ea0741d..ea0741d 100755 --- a/example/section_scolarite.tex +++ b/yaac-another-awesome-cv/example/section_scolarite.tex diff --git a/example/yaac-another-awesome-cv.cls b/yaac-another-awesome-cv/example/yaac-another-awesome-cv.cls index 47c3c89..47c3c89 120000 --- a/example/yaac-another-awesome-cv.cls +++ b/yaac-another-awesome-cv/example/yaac-another-awesome-cv.cls diff --git a/fonts/SourceSansPro-Black.otf b/yaac-another-awesome-cv/fonts/SourceSansPro-Black.otf Binary files differindex 0c25f3d..0c25f3d 100755 --- a/fonts/SourceSansPro-Black.otf +++ b/yaac-another-awesome-cv/fonts/SourceSansPro-Black.otf diff --git a/fonts/SourceSansPro-BlackIt.otf b/yaac-another-awesome-cv/fonts/SourceSansPro-BlackIt.otf Binary files differindex da3504c..da3504c 100755 --- a/fonts/SourceSansPro-BlackIt.otf +++ b/yaac-another-awesome-cv/fonts/SourceSansPro-BlackIt.otf diff --git a/fonts/SourceSansPro-Bold.otf b/yaac-another-awesome-cv/fonts/SourceSansPro-Bold.otf Binary files differindex 98dbee7..98dbee7 100755 --- a/fonts/SourceSansPro-Bold.otf +++ b/yaac-another-awesome-cv/fonts/SourceSansPro-Bold.otf diff --git a/fonts/SourceSansPro-BoldIt.otf b/yaac-another-awesome-cv/fonts/SourceSansPro-BoldIt.otf Binary files differindex 6600c86..6600c86 100755 --- a/fonts/SourceSansPro-BoldIt.otf +++ b/yaac-another-awesome-cv/fonts/SourceSansPro-BoldIt.otf diff --git a/fonts/SourceSansPro-ExtraLight.otf b/yaac-another-awesome-cv/fonts/SourceSansPro-ExtraLight.otf Binary files differindex f885ce7..f885ce7 100755 --- a/fonts/SourceSansPro-ExtraLight.otf +++ b/yaac-another-awesome-cv/fonts/SourceSansPro-ExtraLight.otf diff --git a/fonts/SourceSansPro-ExtraLightIt.otf b/yaac-another-awesome-cv/fonts/SourceSansPro-ExtraLightIt.otf Binary files differindex f932024..f932024 100755 --- a/fonts/SourceSansPro-ExtraLightIt.otf +++ b/yaac-another-awesome-cv/fonts/SourceSansPro-ExtraLightIt.otf diff --git a/fonts/SourceSansPro-It.otf b/yaac-another-awesome-cv/fonts/SourceSansPro-It.otf Binary files differindex 2d627d9..2d627d9 100755 --- a/fonts/SourceSansPro-It.otf +++ b/yaac-another-awesome-cv/fonts/SourceSansPro-It.otf diff --git a/fonts/SourceSansPro-Light.otf b/yaac-another-awesome-cv/fonts/SourceSansPro-Light.otf Binary files differindex 159979f..159979f 100755 --- a/fonts/SourceSansPro-Light.otf +++ b/yaac-another-awesome-cv/fonts/SourceSansPro-Light.otf diff --git a/fonts/SourceSansPro-LightIt.otf b/yaac-another-awesome-cv/fonts/SourceSansPro-LightIt.otf Binary files differindex e3d49b5..e3d49b5 100755 --- a/fonts/SourceSansPro-LightIt.otf +++ b/yaac-another-awesome-cv/fonts/SourceSansPro-LightIt.otf diff --git a/fonts/SourceSansPro-Regular.otf b/yaac-another-awesome-cv/fonts/SourceSansPro-Regular.otf Binary files differindex bdcfb27..bdcfb27 100755 --- a/fonts/SourceSansPro-Regular.otf +++ b/yaac-another-awesome-cv/fonts/SourceSansPro-Regular.otf diff --git a/fonts/SourceSansPro-Semibold.otf b/yaac-another-awesome-cv/fonts/SourceSansPro-Semibold.otf Binary files differindex fffdbaf..fffdbaf 100755 --- a/fonts/SourceSansPro-Semibold.otf +++ b/yaac-another-awesome-cv/fonts/SourceSansPro-Semibold.otf diff --git a/fonts/SourceSansPro-SemiboldIt.otf b/yaac-another-awesome-cv/fonts/SourceSansPro-SemiboldIt.otf Binary files differindex e90515b..e90515b 100755 --- a/fonts/SourceSansPro-SemiboldIt.otf +++ b/yaac-another-awesome-cv/fonts/SourceSansPro-SemiboldIt.otf diff --git a/yaac-another-awesome-cv/yaac-another-awesome-cv.cls b/yaac-another-awesome-cv/yaac-another-awesome-cv.cls new file mode 100644 index 0000000..00f7af5 --- /dev/null +++ b/yaac-another-awesome-cv/yaac-another-awesome-cv.cls @@ -0,0 +1,864 @@ +%% Copyright 2016 Christophe Roger +% +% Author: +% Christophe Roger (Darwiin) +% +% Adapted: +% Feb. 27, 2021 Suren A. Chilingaryan +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is M. C. Roger. +% +% This work consists of the files awesome-source-cv.cls + +\ProvidesClass{yaac-another-awesome-cv}[2020/03/24 v2.2.1 'YAAC: Another Awesome CV' Class] + +\def\@@ptsize{10pt} + +\DeclareOption{10pt}{\def\@@ptsize{10pt}} +\DeclareOption{11pt}{\def\@@ptsize{11pt}} +\DeclareOption{12pt}{\def\@@ptsize{12pt}} + +\ProcessOptions\relax + +\LoadClass[a4paper,\@@ptsize]{article} + +\newif\if@showLinks \@showLinksfalse +\newif\if@isCompact \@isCompactfalse + +\DeclareOption{green}{ + \def\@green{green} +} + +\DeclareOption{red}{ + \def\@red{red} +} + +\DeclareOption{indigo}{ + \def\@indigo{indigo} +} +\DeclareOption{orange}{ + \def\@orange{orange} +} + +\DeclareOption{monochrome}{ + \def\@monochrome{monochrome} +} + +\DeclareOption{localFont}{ + \def\@local{local} +} + +\DeclareOption{alternative}{ + \def\@alternative{alternate} +} + +\DeclareOption{dsvariant}{ + \def\@dsvariant{ds} +} + + +\DeclareOption{showLinks}{ \@showLinkstrue} +\DeclareOption{compact}{ \@isCompacttrue} + +\ProcessOptions + +% Dependences +%A Few Useful Packages +\RequirePackage[english]{babel} +%\RequirePackage[english,french]{babel} +\RequirePackage[utf8]{luainputenc} +\RequirePackage{fontspec} % for loading fonts +\RequirePackage{url,parskip} % other packages for formatting +\RequirePackage[usenames,dvipsnames,table]{xcolor} +\RequirePackage{fullpage} +\RequirePackage[margin=1.5cm]{geometry} +\RequirePackage[fixed]{fontawesome5} +\RequirePackage{hyperref} +\RequirePackage{titlesec} +\RequirePackage{array} +\RequirePackage{enumitem} +\RequirePackage{longtable} +\RequirePackage{etoolbox} +\RequirePackage{tikz} +\RequirePackage[skins]{tcolorbox} +\RequirePackage{fancyhdr} +\RequirePackage{ifthen} + +% DS: Latex complains +%\DeclareUnicodeCharacter{00E9}{\'{e}} +% Define default accent colors +\definecolor{headcolor}{HTML}{000066} %BLUE +\definecolor{basecolor}{HTML}{000000} %BLACK + +\ifundef{\@green} { + \ifundef{\@red} { + \ifundef{\@indigo}{ + \ifundef{\@orange} { + \ifundef{\@monochrome} {} + { \definecolor{basecolor}{HTML}{000000}} + } + { \definecolor{basecolor}{HTML}{e68a00} } + } + { \definecolor{basecolor}{rgb}{0.2, 0.07, 0.48} } + } + { \definecolor{basecolor}{HTML}{b30000} } %RED +} +{ \definecolor{basecolor}{rgb}{0.0, 0.62, 0.38} } + +\definecolor{darkGrey}{HTML}{989898} + +\colorlet{linkcolor}{basecolor} +\colorlet{accentcolor}{linkcolor!90}%{headcolor!90} +\colorlet{symbolcolor}{linkcolor!85} + +% Setup hyperref package, and colours for links +%\definecolor{linkcolour}{rgb}{0,0.2,0.6} + +\if@showLinks + \hypersetup{% + breaklinks + }% +\else + \hypersetup{% + pdfborder = {0 0 0}, + breaklinks + }% +\fi + +% Setup fancyhdr package +\fancyhf{} +\fancyhfoffset{0em} +% Remove head rule +\renewcommand{\headrulewidth}{0pt} +%\fancyfoot[C]{\thepage} +\pagestyle{fancy} + +%\pagestyle{empty} % non-numbered pages +%\font\fb=''[cmr10]'' % for use with \LaTeX command + +% Setup CV sections +\titleformat{\section}{\Large\raggedright}{}{0em}{}[\titlerule] +\titlespacing{\section}{0pt}{2pt}{2pt} + +% Configure list +\setlist[itemize,1]{label=\faAngleRight, nosep, leftmargin=2em} +\setlist[itemize,2]{label=\faAngleRight, nosep, leftmargin=1.5em} + +% Setup Array : new column type +\newcolumntype{R}[1]{>{\hfill}m{#1}} + +%Italian hyphenation for the word: ''corporations'' +\hyphenation{im-pre-se} + +% Setup fonts +\defaultfontfeatures{Mapping=tex-text} +% + +% Define font to use according to localFont option +\ifundef{\@local} +{ +% DS: Original fonts are ugly +% \setmainfont[BoldFont = Helvetica Neue, ItalicFont=Helvetica Neue Thin Italic ,SmallCapsFont = Helvetica Neue Light]{Helvetica Neue Thin} +% \setmainfont{Source Sans Pro Light}[BoldFont = SourceSansPro-Regular, ItalicFont= Source Sans Pro Light Italic] +% \setmainfont{TeX Gyre Termes} +% \setmainfont{TeX Gyre Pagella} +% \defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase} + \setmainfont{Liberation Serif}[ +% Ligatures=TeX, +% ItalicFont=* Italic, +% BoldFont=* Bold, +% BoldItalicFont=* Bold Italic, +% UprightFont=* Regular, + SmallCapsFont=Latin Modern Roman Caps + ] + \setsansfont{Liberation Sans}[SmallCapsFont={Liberation Sans}] + \setmonofont{Liberation Mono}[SmallCapsFont={Liberation Mono}] + +} +{ + \setmainfont{SourceSansPro-Light}[ + Path = fonts/, + BoldFont = SourceSansPro-Regular, + ItalicFont = SourceSansPro-LightIt] +} + +% DS: Adapt default parameters +\newlength{\topoffset} +\setlength{\topoffset}{0.2em} + +%New length definition +\newlength{\fulllength} +%\setlength{\fulllength}{17.8cm} +\setlength{\fulllength}{17.0cm} + +\newlength{\topleftcolumnlength} +\setlength{\topleftcolumnlength}{4cm} +\newlength{\toprightcolumnlength} +\setlength{\toprightcolumnlength}{\dimexpr(\fulllength-\topleftcolumnlength)\relax} + +\newlength{\leftcolumnlength} +\setlength{\leftcolumnlength}{2.5cm} + +\newlength{\rightcolumnlength} +%\setlength{\rightcolumnlength}{15.3cm minus 1cm} +%\setlength{\rightcolumnlength}{\dimexpr(\fulllength-\leftcolumnlength)\relax} +\setlength{\rightcolumnlength}{\dimexpr(\fulllength-\leftcolumnlength)\relax} + +% Override default left column length of (2.5cm) +% Usage: \setleftcolumnlength{<length>} +\newcommand{\setleftcolumnlength}[1]{ + \setlength{\leftcolumnlength}{#1} + \setlength{\rightcolumnlength}{\dimexpr(\fulllength-\leftcolumnlength)\relax} +} + +% Font Awesome icons aliases +\newcommand{\mailSymbol}{\faAt} +\newcommand{\locationSymbol}{\faMapMarker*} +\newcommand{\infoSymbol}{\faInfo} +\newcommand{\linkedinSymbol}{\faLinkedinIn} +\newcommand{\viadeoSymbol}{\faViadeo} +\newcommand{\mobileSymbol}{\faMobile*} +\newcommand{\githubSymbol}{\faGithub} +\newcommand{\stackoverflowSymbol}{\faStackOverflow} +\newcommand{\stackexchangeSymbol}{\faStackExchange} +\newcommand{\mediumSymbol}{\faMedium} +\newcommand{\bitbucketSymbol}{\faBitbucket} +\newcommand{\websiteSymbol}{\faLink} + + +\newcommand\link[2]{\color{linkcolor}\href{#1}{#2}\color{Black} } +\newcommand\important[1]{\textbf #1} + +% Create a tag +% Usage: \cvtag{<tag label>} +\newcommand{\cvtag}[1]{% + \tikz[baseline]\node[anchor=base,draw=darkGrey!70,rounded corners=0.5ex,inner xsep=1ex,inner ysep =0.55ex,text height=1.3ex,text depth=.25ex]{#1}; +} + +% Render author's name +% Usage: \user{<firstanme>}{<lastname>} +\newcommand\user[2]{\color{accentcolor}{\LARGE #1 \textsc{\textbf{#2}}}\color{Black}} + +% Render a text with its symbol +% Usage; \socialtext{<icon>}{<label>} +\newcommand{\socialtext}[2]{\mbox{\textcolor{symbolcolor}{#1}#2\hspace{0.8em}}} + +% Render a link with its symbol +% Usage; \sociallink{<icon>}{<label>} +\newcommand{\sociallink}[3]{\mbox{\textcolor{symbolcolor}{#1}\link{#2}{#3}\hspace{0.8em}}} + +% Define author's name +% Usage: \name{<firstname>}{<lastname>} +% Usage: \firstname{<firstname>} +% Usage: \lastname{<lastname>} +% Usage: \familyname{<familyname>} +\newcommand*{\name}[2]{\def\@firstname{#1}\def\@lastname{#2}} +\newcommand*{\firstname}[1]{\def\@firstname{#1}} +\newcommand*{\lastname}[1]{\def\@lastname{#1}} +\newcommand*{\familyname}[1]{\def\@lastname{#1}} +\def\@familyname{\@lastname} + +% Define author's tagline +% Usage: \tagline{<tag line>} +\newcommand*{\tagline}[1]{\def\@tagline{#1}} + +% Define author's photo +% Usage: \photo[<shape: circular, square, roundedsquare, squircle>]{<diameter>}{<photo>} +% The shape of the author's photo is circular by default. +\newcommand{\photo}[3][circular]{\def\@photo{#3}\def\@photodiameter{#2}\def\@photoshape{#1}} + +% Render author's address +% Usage: \address{<address>} +\newcommand*{\address}[1]{\socialtext{\locationSymbol}{#1}} + +% Render author's infos +% Usage: \infos{<infos>} +\newcommand*{\infos}[1]{\socialtext{\infoSymbol}{#1}} + +% DS: Defrancise, shorten +% Render author's linked-in (optional) +% Usage: \linkedin{<linked-in-nick>} +%\newcommand*{\linkedin}[1]{\sociallink{\linkedinSymbol}{http://www.linkedin.com/in/#1/fr}{linkedin.com/in/#1}} +\newcommand*{\linkedin}[1]{\sociallink{\linkedinSymbol}{http://www.linkedin.com/in/#1}{linkedin}} +%\newcommand*{\linkedin}[1]{\sociallink{\linkedinSymbol}{http://www.linkedin.com/in/#1}{#1}} + +% Render author's viadeo(optional) +% Usage: \viadeo{<viadeo-nick>} +\newcommand*{\viadeo}[1]{\sociallink{\viadeoSymbol}{http://www.viadeo.com/fr/profile/#1}{viadeo.com/fr/profile/#1}} + +% Render author's github (optional) +% Usage: \github{<github-nick>} +\newcommand*{\github}[1]{\sociallink{\githubSymbol}{https://www.github.com/#1}{github.com/#1}} % Github icon + URL + +% Render author's stackoverflow profile (optional) +% Usage: \stackoverflow{<stackoverflow-user-id>} +\newcommand*{\stackoverflow}[1]{\sociallink{\stackoverflowSymbol}{https://www.stackoverflow.com/u/#1}{stackoverflow.com/u/#1}} + +% Render author's stackexchange profile (optional) +% Usage: \stackexchange{<stackexchange-user-id>} +\newcommand*{\stackexchange}[1]{\sociallink{\stackexchangeSymbol}{https://stackexchange.com/users/#1}{stackexchange.com/users/#1}} + +% Render author's medium (optional) +% Usage: \medium{<medium-nick>} +\newcommand*{\medium}[1]{\sociallink{\mediumSymbol}{https://www.medium.com/@#1}{medium.com/#1}} + +% Render author's bitbucket (optional) +% Usage: \bitbucket{<bitbucket-account-name>} +\newcommand*{\bitbucket}[1]{\sociallink{\bitbucketSymbol}{https://bitbucket.com/#1}{bitbucket.com/#1}} + +% Render author's email (optional) +% Usage: \email{<email adress>} +\newcommand*{\email}[1]{\sociallink{\mailSymbol}{mailto:#1}{#1}} + +% Render a website link (optional) +% Usage: \website{<website name>}{<website adress>} +\newcommand*{\website}[2]{\sociallink{\websiteSymbol}{#1}{#2}} + +% Render author's mobile phone (optional) +% Usage: \smartphone{<mobile phone number>} +\newcommand*\smartphone[1]{\socialtext{\mobileSymbol}{#1}} + +% Render author's tagline +\newcommand\resumetitle[1]{ + \ifundef{\@alternative}{ + \par{ + \bigskip\center{\Large \color{accentcolor}\textbf{#1}\color{Black}}\par + } + \bigskip + }{ + \color{accentcolor}\textbf{\large{#1}}\color{black} + } +} + +\newcommand\idphoto{ + \ifthenelse{\equal{\@photoshape}{square}}{ + % Draw square photo + \tikz\path[fill overzoom image={\@photo}]rectangle(\linewidth,\linewidth); + }{ + \ifthenelse{\equal{\@photoshape}{roundedsquare}}{ + % Draw square photo with rounded corners + \tikz\path[fill overzoom image={\@photo}][rounded corners=2mm]rectangle(\linewidth,\linewidth); + }{ + \ifthenelse{\equal{\@photoshape}{squircle}}{ + % Draw squircle photo + \tikz\path[fill overzoom image={\@photo}][rounded corners=8mm]rectangle(\linewidth,\linewidth); + }{ + % Draw circular photo + \tikz\path[fill overzoom image={\@photo}]circle[radius=0.5\linewidth]; + } + } + + } +} + +% Define social entries to print in header +\newcommand{\socialinfo}[1]{\def\@socialinfo{#1}} +\newcommand{\headermsg}[1]{\def\@headermsg{#1}} + +% Render CV header +% Needs \@firstname, \@lastname and \@tagline to be defined +\newcommand*{\makecvheader}{ + \ifdef{\@dsvariant}{ + \ifundef{\@photodiameter}{ + \begin{minipage}{\linewidth} + }{ + \begin{minipage}{\dimexpr\linewidth-\@photodiameter-2em} + } + \ifundef{\@tagline}{ + \user{\@firstname}{\@lastname} + }{ + \user{\@firstname}{\@lastname}\\ + \resumetitle{\@tagline} + } + \vskip-\topskip\vskip0.3em\rule{\linewidth}{0.1pt} + \smallskip + \begin{tabular}{>{\raggedright}m{\topleftcolumnlength} m{\toprightcolumnlength}} + \noalign{\vskip\topoffset} + \small{\@socialinfo} & \@headermsg + \end{tabular} + \end{minipage} + + \ifdef{\@photodiameter}{ + \begin{minipage}{\@photodiameter} + \idphoto + \end{minipage} + }{} + \bigskip + }{ + \ifundef{\@alternative}{ + \ifundef{\@photodiameter}{ + \begin{minipage}{\linewidth} + }{ + \begin{minipage}{\dimexpr\linewidth-\@photodiameter-2em} + } + \color{accentcolor}\user{\@firstname}{\@lastname}\color{black}\\ + \small{\@socialinfo} + \end{minipage} + \ifdef{\@photodiameter}{ + \begin{minipage}{\@photodiameter} + \idphoto + \end{minipage} + }{} + \resumetitle{\@tagline} + }{ + \ifundef{\@photodiameter}{ + \begin{minipage}{\linewidth} + }{ + \begin{minipage}{\dimexpr\linewidth-\@photodiameter-2em} + } + \user{\@firstname}{\@lastname}\\ + \resumetitle{\@tagline} + \smallskip\\ + \small{\@socialinfo} + \end{minipage} + \ifdef{\@photodiameter}{ + \begin{minipage}{\@photodiameter} + \idphoto + \end{minipage} + }{} + \bigskip + } + } +} + +% Define a footer for CV +% Usage: \makecvfooter{<left>}{<center>}{<right>} +\newcommand*{\makecvfooter}[3]{% + \fancyfoot{} + \fancyfoot[L]{#1} + \fancyfoot[C]{#2} + \fancyfoot[R]{#3} +} + +% Resume part title definition +\newcommand\sectionTitle[2]{\section{\texorpdfstring{\color{accentcolor}#2\enspace \textsc{#1}}{#1}}} + +% Define the 'keywords' environment +\newenvironment{keywords}{% + \renewcommand{\arraystretch}{1.1} + + \begin{tabular}{>{}r>{}p{13cm}} +}{% + \end{tabular} +} + + + +% Render a scholarshipentry in the scolarship environment +% Usage: \scholarshipentry{<date>}{<description>} +\newcommand\keywordsentry[2]{ + \textbf{#1} & #2\\ +} + +% Define a new column type for the scholarship environment +\newcolumntype{Y}{>{\raggedleft}p{\leftcolumnlength}} + +% Define the 'scholarship' environment +\newenvironment{scholarship}{% + \begin{tabular}{Y p{\rightcolumnlength}} +}{% + \end{tabular} +} + +% Render a scholarshipentry in the scolarship environment +% Usage: \scholarshipentry{<date>}{<description>} +\newcommand\scholarshipentry[2]{ + #1 & #2 \\ +} + +% Define the 'skills' environment +\newenvironment{skills}{% + \begin{longtable}{R{\leftcolumnlength}p{\rightcolumnlength}} +}{% + \end{longtable} +} + +% Render a skill in the skills environment +% Usage: \skill{<skill>}{<level>} +\newcommand\skill[2]{ + \textbf{#1} & \foreach \x in {1,...,5}{{\color{accentcolor!80} \ifnumgreater{\x}{#2}{\faCircle[regular]}{\faCircle}}\enspace } \\ +} + +\newcolumntype{E}{>{\raggedright\arraybackslash}p{\rightcolumnlength}} + +% Define the 'experiences' environment +\newenvironment{experiences}{% + \begin{longtable}{R{\leftcolumnlength}|E} +}{% + \end{longtable} +} + +% Render an experience in the experiences environment +% Usage: +% \experience +% {<End date>} {<Title>}{<Enterprise>}{<Country>} +% {<Start date} { +% <Experience description (Could be a list)> +% } +% {<Technology list>} +\newcommand\experience[7]{ + \textbf{#1} & \textbf{#2, \textsc{#3}, #4} \\* + \textbf{#5} & \begin{minipage}[t]{\rightcolumnlength} + #6 + \end{minipage} \\* + & \footnotesize{\foreach \n in {#7}{\cvtag{\n}}} \\ + } + +% Render a consultant experience in the experiences environment +% Usage: +% \consultantexperience +% {<End date>} {<Consultant title>}{<Consulting Enterprise>}{<Country>} +% {<Start date} {<Client title>}{<Client business unit>} +% { +% <Experience description (Could be a list)> +% } +% {<Technology list>} +\newcommand\consultantexperience[9]{ + \textbf{#1} & \textbf{#2, \textsc{#3}, #4} \\* + \textbf{#5} & \emph{#6} pour \textsc{#7} \\* + & \begin{minipage}[t]{\rightcolumnlength} + #8 + \end{minipage} \\* + & \footnotesize{\foreach \n in {#9}{\cvtag{\n}}} \\ + } + +% Define the empty separator macro with different spacing according to document class option 'compact' +\if@isCompact + \newcommand\emptySeparator{\multicolumn{2}{c}{}\\[-0.6em]} +\else + \newcommand\emptySeparator{\multicolumn{2}{c}{}\\} +\fi + + + +% Define the 'projects' environment +\newenvironment{projects}{% + \begin{longtable}{l} +}{% + \end{longtable} +} + +% Define the 'project' entry in the 'projects' environment +% Usage: +% \project +% {<Project name>}{<dates>} +% {<link1> <link2>} +% {<Project description>} +% {<techno1>,<techno2>} +\newcommand\project[5]{ + \begin{minipage}[t]{\dimexpr(\linewidth) - 1.5em} + \textbf{\textsc{#1}} \hfill \textsc{#2}\smallskip\\ + #3\\ + #4\smallskip\\ + \footnotesize{\foreach \n in {#5}{\cvtag{\n}}}\\ + \end{minipage} + \\* +} + + +\newcommand*\twocolumnsection[2]{ + \begin{minipage}[t]{\dimexpr(\linewidth/2) - 3em} + #1 + \end{minipage} + \hfill + \begin{minipage}[t]{\dimexpr(\linewidth/2) - 3em} + #2 + \end{minipage} + } + +% Define the 'referencees' environment +\newenvironment{referees}{% +}{% + \hfill + \bigskip +} + +\newcommand*\referee[5]{ + \hspace{1em} + \begin{minipage}[t]{\dimexpr(\linewidth/3) - 3em} + \begin{tabular}{>{}l >{}l} + \multicolumn{2}{l}{\textbf{#1}}\\ + \multicolumn{2}{l}{\emph{#2}, \textsc{#3}}\\ + \quad \mailSymbol & \href{mailto:#4}{#4} \\ + \quad \faPhone & #5 \\ + \end{tabular} + \end{minipage}% + } + +\newcommand*\refereeMailOnly[4]{ + \hspace{1em} + \begin{minipage}[t]{\dimexpr(\linewidth/3) - 3em} + \begin{tabular}{>{}l >{}l} + \multicolumn{2}{l}{\textbf{#1}}\\ + \multicolumn{2}{l}{\emph{#2}, \textsc{#3}}\\ + \quad \mailSymbol & \href{mailto:#4}{#4} \\ + \end{tabular} + \end{minipage}% +} + +% DS: Extensions +\RequirePackage{academicons} +\RequirePackage{ragged2e} +\RequirePackage{makecell} +\RequirePackage{fontawesome5} +\usepackage{ifthen} +\usepackage[nodisplayskipstretch]{setspace} +\usepackage{mfirstuc} +\usepackage{booktabs} + +%\RequirePackage{xparse} +%\RequirePackage{tabularx} +%\RequirePackage{multicol} +%\RequirePackage{extdash} + +%Configs +%\setstretch{1} + +\newcommand\ifemptyelse[3]{\ifthenelse{\equal{#1}{}}{#2}{#3}} +\def \ifempty#1{\def\temp{#1} \ifx\temp\empty} +\renewcommand{\cellalign}{tl} + +%Symbols +\newcommand{\skypeSymbol}{\faSkype} +\newcommand{\scholarSymbol}{\hskip1ex\aiGoogleScholar} +\newcommand{\orcidSymbol}{\hskip1ex\aiOrcid} +\newcommand{\rgSymbol}{\hskip1ex\aiResearchGate} + +%\def\faSourcetree{{\FontAwesomeBrands\csname faicon@sourcetree\endcsname}} +\newcommand{\ossSymbol}{\faSourcetree} + +% Markup +\newcommand{\hltag}[1]{% highlight (or red!10) + \tikz[baseline]\node[anchor=base,draw=darkGrey!70,fill=darkGrey!20,rounded corners=0.5ex,inner xsep=1ex,inner ysep =0.55ex,text height=1.3ex,text depth=.25ex]{#1}; +} + +% Links, etc. +\newcommand*{\urlref}[2]{\href{#2}{#1}} +\newcommand*{\oss}[2]{\link{#2}{\ossSymbol #1}} + +% Contacts +\newcommand*{\skype}[1]{\sociallink{\skypeSymbol}{skype:#1}{#1}} +%\newcommand*{\scholar}[1]{\sociallink{\scholarSymbol}{https://scholar.google.com/citations?user=#1}{#1}} +%\newcommand*{\orcid}[1]{\sociallink{\orcidSymbol}{https://orcid.org/#1}{#1}} +%\newcommand*{\rg}[1]{\sociallink{\rgSymbol}{https://www.researchgate.net/profile/#1}{#1}} + +\newcommand*{\scholar}[2]{\sociallink{\scholarSymbol}{https://scholar.google.com/citations?user=#1}{#2}} +\newcommand*{\scholarlink}[2]{\urlref{#2}{https://scholar.google.com/citations?user=#1}} + +\newcommand*{\orcid}[2]{\sociallink{\orcidSymbol}{https://orcid.org/#1}{#2}} +\newcommand*{\orcidlink}[2]{\urlref{#2}{https://orcid.org/#1}} +\newcommand*{\rg}[2]{\sociallink{\rgSymbol}{https://www.researchgate.net/profile/#1}{#2}} +\newcommand*{\rglink}[2]{\urlref{#2}{https://www.researchgate.net/profile/#1}} + +% References +\newcommand\refstd{\emph} +\newcommand\reflinked[1]{\hyperlink{#1}{\emph{#1}}} +\newcommand\refuni{\refstd} +\newcommand\refexp{\reflinked} +\newcommand\reffac{\reflinked} +\newcommand\refcol{\reflinked} +\newcommand\refproj[1]{\hyperlink{proj:#1}{\emph{#1}}} +\newcommand\refsoft[1]{\hyperlink{soft:#1}{\emph{#1}}} + +\newcommand\hlnone[1]{#1} +\newcommand\hlbold[1]{\textbf{#1}} +\newcommand\hlcolor[1]{\textcolor{headcolor}{#1}} + +\newcommand\hltitle{\hlbold} +\newcommand\hljob{\hlbold} +\newcommand\hlsoft{\hlnone} +\newcommand\hlverb{\hlnone} +\newcommand\hlrole{\hlnone} +\newcommand\hltype{\hlnone} +\newcommand\hlproj{\hlnone} + +% Dates +\newcommand\since[1]{Since #1} +\newcommand\ivl[2]{#1 -- #2} +\newcommand\at[2]{#1 #2} + +%Sizes + +%\newlength{\tricolumnlength} +%\setlength{\tricolumnlength}{2cm} +%\newlength{\midcolumnlength} +%\setlength{\midcolumnlength}{\dimexpr(\fulllength-\leftcolumnlength-\tricolumnlength)\relax} + +% Running titles +%\newcommand\subtitle[2]{\section{\texorpdfstring{\color{accentcolor}#2\enspace \textsc{#1}}{#1}}} +\newcommand\subtitle[2]{\section{\texorpdfstring{\textsc{#1}}{#1}}} + +% Column types +\newcolumntype{C}{>{\raggedright}p{\topleftcolumnlength}} +\newcolumntype{K}{p{\toprightcolumnlength}} + +%\newcolumntype{L}{>{\raggedright}p{\leftcolumnlength}} +\newcolumntype{L}{>{\raggedleft}p{\leftcolumnlength}} +\newcolumntype{R}{p{\rightcolumnlength}} + + +% Lists +%\newenvironment{tricoltable}{\begin{longtable}{L p{\midcolumnlength} p{\tricolumnlength}}}{\end{longtable}} +\newenvironment{categories}{\begin{tabular}{C K}}{\end{tabular}} +\newenvironment{jobs}{\begin{longtable}{C K}}{\end{longtable}} +\newenvironment{events}{\begin{longtable}{L | R}}{\end{longtable}} + +%\setlength{\arrayrulewidth}{1mm} + %\makeatletter +%\def\CT@arc#1#2{\ifdim\baselineskip=\z@\noalign\fi{\gdef\CT@arc@{\color#1{#2}}}}\let\CT@arc@\relax +%\def\rulecolor#1#{\CT@arc{#1}} +%\rulecolor{gray!50} + +\arrayrulecolor{gray!50} +\newenvironment{complexevents}{% + \renewcommand{\arraystretch}{1.4}% + \begin{longtable}{L | R}% +}{% + \end{longtable}% + \renewcommand{\arraystretch}{1.0}% +} + +\newenvironment{verycomplexevents}{% + \renewcommand{\arraystretch}{1.4}% + \begin{longtable}{L | R}% +}{% + \end{longtable}% + \renewcommand{\arraystretch}{1.0}% +} + +\newcommand\subsectiontitle[1]{% + \multicolumn{2}{l}{% + \hspace{\leftcolumnlength}\hspace{1em}\textbf{#1}% + } \\\cline{2-2}% +} + +\newcommand\eventsection[2]{% + \ifx #2\empty\else + \end{#2}% + \vspace{-1em}% + \begin{#2}% + \fi + \multicolumn{2}{l}{% + \hspace{\leftcolumnlength}\hspace{1em}\textbf{#1}% + } \\\cline{2-2}% +} + +\newcommand\datedeventsection[3]{% + \ifx #3\empty\else + \end{#3}% + \vspace{-1em}% + \begin{#3}% + \fi% + \enspace \textbf{#1} & \textbf{#2} \\\hline +} + + + +% Usage: \category{<name>}{<keywords>} +\newcommand\category[2]{ \textbf{#1} & #2 \\} + +% Usage: \event {<dates>} [<Title>][at]{Details} +\newcommand\event[2]{\enspace #1 & #2\\} + +%\newcommand\triplevent[3]{ \enspace #1 & #2 & #3 \\ } +%\newcommand\tripleventsection[2]{ \enspace \underline{\textbf{#1}} & \textbf{#2} & xxx \\ } + +% \activity {dates} {name} {long_name} {description} {responsibilities} + +\newcommand\titledevent[3]{\event{#1}{\hltitle{#2} #3}} +\newcommand\jobevent[4]{\event{#1}{\hljob{#2} at\ifempty{#4}#3\else #3. #4\fi}} +%\newcommand\jobevent[4]{\event{#1}{\textbf{#2} at #3. #4}} +\newcommand\linkedevent[3]{\event{#1}{\urlref{#2}{#3}}} + +\newcommand\excofa[5]{\noalign{\hypertarget{#2}{}} \linkedevent{#1}{\ifemptyelse{#3}{\hlproj{#2}}{\hlproj{#2}: #3}\ifemptyelse{#5}{}{ \emph{(#5)}}}{#4}} +\newcommand\experiment[5]{\excofa{#1}{#2}{#3}{#4}{#5}} % \emph{(Collaborator)}}} +\newcommand\collaboration[5]{\excofa{#1}{#2}{#3}{#4}{#5}}% \emph{(Collaborator)}}} +\newcommand\facility[5]{\excofa{#1}{#2}{#3}{#4}{#5}}% \emph{(Contributor)}}} + +\newcommand\funding[7]{\noalign{\foreach \n in {#4}{\hypertarget{proj:\n}{}}} \event{#1}{ +%\newcommand\funding[7]{\noalign{\ifemptyelse{#7}{}{\foreach \n in {#7}{\hypertarget{XXX}{}}}} \event{#1}{ + \begin{minipage}[t]{\dimexpr(\linewidth)} + \hlrole{#5}: #6 \\ % #7 + \footnotesize{\hltag{#2} \foreach \n in {#3}{\cvtag{\n}}} + \end{minipage} +}} + +\newcommand\leadership[5]{\event{#1}{ + \begin{minipage}[t]{\dimexpr(\linewidth)} + \hlverb{#2} #3 \\ + #4: \footnotesize{\foreach \n in {#5}{\cvtag{\n}}} + \end{minipage} +}} + +\newcommand\responsibility[3]{\event{#1}{\makefirstuc{#3}}} + +\newcommand\software[7]{\noalign{\hypertarget{soft:#2}{}} \event{#1}{ + \begin{minipage}[t]{\dimexpr(\linewidth)} + \hlsoft{\urlref{#2}{http://#3}}: \ifemptyelse{#7}{#6}{#6 (\emph{#7})} + \ifemptyelse{#4#3}{}{ + \\ \footnotesize{ + \ifemptyelse{#3}{}{ + \hltag{\urlref{#3}{http://#3}} + } + \foreach \n in {#4}{\cvtag{\hyperlink{\n}{\n}}} + } + } + \end{minipage} +}} + +\newcommand\obsolete[7]{\event{#1}{ + \hlsoft{\urlref{#2}{http://#3}}: \ifemptyelse{#7}{#6}{#6 (\emph{#7})} +}} + +\newcommand*{\toright}[1]{% + \nobreak\hfill\penalty50\hskip1em\null\nobreak% + \hfill #1\parfillskip=0pt \finalhyphendemerits=0 \par} + +\newcommand\rnd[5]{\event{#1}{% + \begin{minipage}[t]{\dimexpr(\linewidth)}% + \hlverb{#4} #5% + \footnotesize{\toright{% + \ifemptyelse{#2}{% + \foreach \n in {#3}{\hyperlink{\n}{\hltag{\n}}}% + }{% + \foreach \n in {#2}{\hyperlink{soft:\n}{\hltag{\n}}}% + }}}% + \end{minipage}% +}} + +\newcommand\research[5]{\rnd{#1}{#2}{#3}{#4}{#5}} +\newcommand\technology[5]{\rnd{#1}{#2}{#3}{#4}{#5}} + +\newcommand\supervision[3]{\event{#1}{\hlverb{#2} #3}} +\newcommand\teaching[3]{\event{#1}{\hlverb{#2} #3}} + +\newcommand\outreach[5]{\event{\footnotesize{#1}}{ + \footnotesize{ + \ifemptyelse{#2}{\hltype{talk}}{% + \hltype{#2} + } "\emph{#3}" at #4 +}}} + +\newcommand\conference[5]{\outreach{#1}{#2}{#3}{#4}{#5}} +\newcommand\workshop[5]{\outreach{#1}{#2}{#3}{#4}{#5}} +\newcommand\seminar[5]{\outreach{#1}{#2}{#3}{#4}{#5}} + +%\NewDocumentCommand{\jobevent}{mmmO{}}{\event{#1}{#2 #3 x}} +%\event{#1}{\textbf{#2} at #3 \IfNoValueTF{}{. #4}} + +% Literature +\usepackage[backend=biber,style=ieee,sorting=ydnt,maxnames=1,mincitenames=1,minbibnames=1,minsortnames=1]{biblatex} +%\renewcommand*{\bibfont}{\small} +\renewcommand*{\bibfont}{\footnotesize} +\usepackage{titling} + |