diff options
Diffstat (limited to 'reproduce/analysis/make')
-rw-r--r-- | reproduce/analysis/make/delete-me.mk | 169 | ||||
-rw-r--r-- | reproduce/analysis/make/demo-plot.mk | 80 | ||||
-rw-r--r-- | reproduce/analysis/make/download.mk | 7 | ||||
-rw-r--r-- | reproduce/analysis/make/format.mk | 86 | ||||
-rw-r--r-- | reproduce/analysis/make/initialize.mk | 36 | ||||
-rw-r--r-- | reproduce/analysis/make/paper.mk | 102 | ||||
-rw-r--r-- | reproduce/analysis/make/top-make.mk | 10 | ||||
-rw-r--r-- | reproduce/analysis/make/verify.mk | 11 |
8 files changed, 297 insertions, 204 deletions
diff --git a/reproduce/analysis/make/delete-me.mk b/reproduce/analysis/make/delete-me.mk deleted file mode 100644 index f4c8600..0000000 --- a/reproduce/analysis/make/delete-me.mk +++ /dev/null @@ -1,169 +0,0 @@ -# Dummy Makefile to create a random dataset for plotting. -# -# Copyright (C) 2018-2022 Mohammad Akhlaghi <mohammad@akhlaghi.org> -# -# This Makefile is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This Makefile 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 this Makefile. If not, see <http://www.gnu.org/licenses/>. - - - - - -# Dummy dataset -# ------------- -# -# Just as a demonstration(!): we will use AWK to generate a table showing X -# and X^2 and draw its plot. -# -# Note that this dataset is directly read by LaTeX to generate a plot, so -# we need to put it in the $(tex-publish-dir) directory. -dm-squared = $(tex-publish-dir)/squared.txt -$(dm-squared): $(pconfdir)/delete-me-squared-num.conf | $(tex-publish-dir) - -# When the plotted values are re-made, it is necessary to also delete -# the TiKZ externalized files so the plot is also re-made by -# PGFPlots. - rm -f $(tikzdir)/delete-me-squared.pdf - -# Write the column metadata in a temporary file name (appending -# '.tmp' to the actual target name). Once all steps are done, it is -# renamed to the final target. We do this because if there is an -# error in the middle, Make will not consider the job to be complete -# and will stop here. - echo "# Data for demonstration plot of default Maneage (MANaging data linEAGE)." > $@.tmp - echo "# It is a simple plot, showing the power of two: y=x^2! " >> $@.tmp - echo "# " >> $@.tmp - echo "# Column 1: X [arbitrary, f32] The horizontal axis numbers." \ - >> $@.tmp - echo "# Column 2: X_POW2 [arbitrary, f32] The horizontal axis to the power of two." \ - >> $@.tmp - echo "# " >> $@.tmp - $(call print-general-metadata, $@.tmp) - -# Generate the table of random values. - awk 'BEGIN {for(i=1;i<=$(delete-me-squared-num);i+=0.5) \ - printf("%-8.1f%.2f\n", i, i*i); }' >> $@.tmp - -# Write it into the final target - mv $@.tmp $@ - - - - - -# Demo image PDF -# -------------- -# -# For an example image, we'll make a PDF copy of the WFPC II image to -# display in the paper. -dm-histdir = $(texdir)/image-histogram -$(dm-histdir): | $(texdir); mkdir $@ -dm-img-pdf = $(dm-histdir)/wfpc2.pdf -$(dm-img-pdf): $(dm-histdir)/%.pdf: $(indir)/%.fits | $(dm-histdir) - -# When the plotted values are re-made, it is necessary to also -# delete the TiKZ externalized files so the plot is also re-made. - rm -f $(tikzdir)/delete-me-image-histogram.pdf - -# Convert the dataset to a PDF. - astconvertt --colormap=gray --fluxhigh=4 $< -h0 -o$@ - - - - - -# Histogram of demo image -# ----------------------- -# -# For an example plot, we'll show the pixel value histogram also. IMPORTANT -# NOTE: because this histogram contains data that is included in a plot, we -# should publish it, so it will go into the $(tex-publish-dir). -dm-img-histogram = $(tex-publish-dir)/wfpc2-histogram.txt -$(dm-img-histogram): $(tex-publish-dir)/%-histogram.txt: $(indir)/%.fits \ - | $(tex-publish-dir) - -# When the plotted values are re-made, it is necessary to also delete -# the TiKZ externalized files so the plot is also re-made. - rm -f $(tikzdir)/delete-me-image-histogram.pdf - -# Generate the pixel value histogram. - aststatistics --lessthan=5 $< -h0 --histogram -o$@.data - -# Put a two-line description of the dataset, copy the column metadata -# from '$@.data', and add copyright. - echo "# Histogram of example image to demonstrate Maneage (MANaging data linEAGE)." \ - > $@.tmp - echo "# Example image URL: $(DEMO-URL)" >> $@.tmp - echo "# " >> $@.tmp - awk '/^# Column .:/' $@.data >> $@.tmp - echo "# " >> $@.tmp - $(call print-general-metadata, $@.tmp) - -# Add the column numbers in a formatted manner, rename it to the -# output and clean up. - awk '!/^#/{printf("%-15.4f%d\n", $$1, $$2)}' $@.data >> $@.tmp - mv $@.tmp $@ - rm $@.data - - - - - -# Basic statistics -# ---------------- -# -# This is just as a demonstration on how to get analysic configuration -# parameters from variables defined in 'reproduce/analysis/config/'. -dm-img-stats = $(dm-histdir)/wfpc2-stats.txt -$(dm-img-stats): $(dm-histdir)/%-stats.txt: $(indir)/%.fits \ - | $(dm-histdir) - aststatistics $< -h0 --mean --median > $@ - - - - - -# TeX macros -# ---------- -# -# This is how we write the necessary parameters in the final PDF. -# -# NOTE: In LaTeX you cannot use any non-alphabetic character in a variable -# name. -$(mtexdir)/delete-me.tex: $(dm-squared) $(dm-img-pdf) $(dm-img-histogram) \ - $(dm-img-stats) - -# Write the number of random values used. - echo "\newcommand{\deletemenum}{$(delete-me-squared-num)}" > $@ - -# Note that since Make variables start with a '$(', if you want to -# use '$' within the shell (not Make), you have to quote any -# occurance of '$' with another '$'. That is why there are '$$' in -# the AWK command below. -# -# Here, we are first using AWK to find the minimum and maximum -# values, then using it again to read each separately to use in the -# macro definition. - mm=$$(awk 'BEGIN{min=99999; max=-min} - !/^#/{if($$2>max) max=$$2; if($$2<min) min=$$2;} - END{print min, max}' $(dm-squared)); - v=$$(echo "$$mm" | awk '{printf "%.3f", $$1}'); - echo "\newcommand{\deletememin}{$$v}" >> $@ - v=$$(echo "$$mm" | awk '{printf "%.3f", $$2}'); - echo "\newcommand{\deletememax}{$$v}" >> $@ - -# Write the statistics of the demo image as a macro. - mean=$$(awk '{printf("%.2f", $$1)}' $(dm-img-stats)) - echo "\newcommand{\deletemewfpctwomean}{$$mean}" >> $@ - median=$$(awk '{printf("%.2f", $$2)}' $(dm-img-stats)) - echo "\newcommand{\deletemewfpctwomedian}{$$median}" >> $@ diff --git a/reproduce/analysis/make/demo-plot.mk b/reproduce/analysis/make/demo-plot.mk new file mode 100644 index 0000000..13b0d45 --- /dev/null +++ b/reproduce/analysis/make/demo-plot.mk @@ -0,0 +1,80 @@ +# Second step of analysis: +# Data for plot of number/fraction of tools per year. +# +# Copyright (C) 2020-2022 Mohammad Akhlaghi <mohammad@akhlaghi.org> +# +# This Makefile is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This Makefile is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. See <http://www.gnu.org/licenses/>. + + + + + +# Table for Figure 1C of Menke+20 +# ------------------------------- +a2mk20f1c = $(tex-publish-dir)/tools-per-year.txt +$(a2mk20f1c): $(mk20tab3) | $(tex-publish-dir) + +# Remove the (possibly) produced figure that is created from this +# table: it is created by LaTeX's TiKZ package, and includes multiple +# files with a fixed prefix. + rm -f $(tikzdir)/figure-tools-per-year* + +# Write the column metadata in a temporary file name (appending +# '.tmp' to the actual target name). Once all steps are done, it is +# renamed to the final target. We do this because if there is an +# error in the middle, Make will not consider the job to be complete +# and will stop here. + echo "# Data of plot showing fraction of papers that mentioned software tools" > $@.tmp + echo "# per year to demonstrate the features of Maneage (MANaging data linEAGE)." >> $@.tmp + >> $@.tmp + echo "# Raw data taken from Menke+2020 (https://doi.org/10.1101/2020.01.15.908111)." \ + >> $@.tmp + echo "# " >> $@.tmp + echo "# Column 1: YEAR [count, u16] Publication year of papers." \ + >> $@.tmp + echo "# Column 2: WITH_TOOLS [frac, f32] Fraction of papers mentioning software tools." \ + >> $@.tmp + echo "# Column 3: NUM_PAPERS [count, u32] Total number of papers studied in that year." \ + >> $@.tmp + echo "# " >> $@.tmp + $(call print-general-metadata, $@.tmp) + + +# Find the maximum number of papers. + awk '!/^#/{all[$$1]+=$$2; id[$$1]+=$$3} \ + END{ for(year in all) \ + printf("%-7d%-10.3f%d\n", year, 100*id[year]/all[year], \ + all[year]) \ + }' $< \ + >> $@.tmp + +# Write it into the final target + mv $@.tmp $@ + + + + + +# Final LaTeX macro +$(mtexdir)/demo-plot.tex: $(a2mk20f1c) $(pconfdir)/demo-year.conf + +# Find the first year (first column of first row) of data. + v=$$(awk '!/^#/ && c==0{c++; print $$1}' $(a2mk20f1c)) + echo "\newcommand{\menkefirstyear}{$$v}" > $@ + +# Find the number of rows in the plotted table. + v=$$(awk '!/^#/{c++} END{print c}' $(a2mk20f1c)) + echo "\newcommand{\menkenumyears}{$$v}" >> $@ + +# Find the number of papers in 1996. + v=$$(awk '$$1==$(menke-demo-year){print $$3}' $(a2mk20f1c)) + echo "\newcommand{\menkenumpapersdemocount}{$$v}" >> $@ + echo "\newcommand{\menkenumpapersdemoyear}{$(menke-demo-year)}" >> $@ diff --git a/reproduce/analysis/make/download.mk b/reproduce/analysis/make/download.mk index 6e67962..7110c8f 100644 --- a/reproduce/analysis/make/download.mk +++ b/reproduce/analysis/make/download.mk @@ -101,5 +101,8 @@ $(inputdatasets): $(indir)/%: | $(indir) $(lockdir) # # It is very important to mention the address where the data were # downloaded in the final report. -$(mtexdir)/download.tex: $(pconfdir)/INPUTS.conf | $(mtexdir) - echo "\\newcommand{\\wfpctwourl}{$(INPUT-wfpc2.fits-url)}" > $@ +$(mtexdir)/download.tex: $(indir)/menke20.xlsx | $(mtexdir) + echo "\newcommand{\menketwentyxlsxname}{menke20.xlsx}" > $@ + echo "\newcommand{\menketwentychecksum}{$(INPUT-menke20.xlsx-sha256)}" >> $@ + echo "\newcommand{\menketwentybytesize}{$(INPUT-menke20.xlsx-size)}" >> $@ + echo "\newcommand{\menketwentyurl}{$(INPUT-menke20.xlsx-url)}" >> $@ diff --git a/reproduce/analysis/make/format.mk b/reproduce/analysis/make/format.mk new file mode 100644 index 0000000..979475f --- /dev/null +++ b/reproduce/analysis/make/format.mk @@ -0,0 +1,86 @@ +# First step of analysis: +# Prepare the data, return basic values. +# +# As a demonstration analysis to go with the paper, we use the data from +# Menke 2020 (DOI:10.1101/2020.01.15.908111). This is a relevant paper +# because it provides interesting statistics about tools and methods used +# in scientific papers. +# +# Copyright (C) 2020-2022 Mohammad Akhlaghi <mohammad@akhlaghi.org> +# +# This Makefile is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This Makefile is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. See <http://www.gnu.org/licenses/>. + + + + +# Save the "Table 3" spreadsheet from the downloaded `.xlsx' file into a +# simple plain-text file that is easy to use. +a1dir = $(badir)/analysis1 +mk20tab3 = $(a1dir)/table-3.txt +$(a1dir):; mkdir $@ +$(mk20tab3): $(indir)/menke20.xlsx | $(a1dir) + +# Set a base-name for the table-3 data. + base=$(basename $(notdir $<))-table-3 + +# Unfortunately XLSX I/O only works when the input and output are in +# the directory it is running. So first, we need to switch to the +# input directory, run it, then put our desired output where we want +# and delete the extra files. + topdir=$$(pwd) + cd $(indir) + xlsxio_xlsx2csv $(notdir $<) + cp $(notdir $<)."Table 3 All by journal by year".csv $$base.csv + rm $(notdir $<).*.csv + cd $$topdir + +# Read the necessary information. Note that we are dealing with a CSV +# (comma-separated value) file. But when there are commas in a +# string, quotation signs are put around it. The `FPAT' values is +# fully described in the GNU AWK manual. In short, it ensures that if +# there is a comma in the middle of double-quotes, it doesn't count +# as a delimter. + echo "# Column 1: YEAR [counter, i16] Year of journal's publication." > $@.tmp + echo "# Column 2: NUM_PAPERS [counter, i16] Number of studied papers in that journal." >> $@.tmp + echo "# Column 3: NUM_PAPERS_WITH_TOOLS [counter, i16] Number of papers with an identified tool." >> $@.tmp + echo "# Column 4: NUM_ID_TOOLS [counter, i16] Number of software/tools that were identified." >> $@.tmp + echo "# Column 5: JOURNAL_NAME [string, str150] Name of journal." >> $@.tmp + awk 'NR>1{printf("%-10d%-10d%-10d%-10d %s\n", $$2, $$3, $$3*$$NF, $$(NF-1), $$1)}' \ + FPAT='([^,]+)|("[^"]+")' $(indir)/$$base.csv >> $@.tmp + +# Set the temporary file as the final target. This was done so if +# there is any possible crash in the steps above, this rule is re-run +# (its final target isn't rebuilt). + mv $@.tmp $@ + + + + + +# Main LaTeX macro file +$(mtexdir)/format.tex: $(mk20tab3) + +# Count the total number of papers in their study. + v=$$(awk '!/^#/{c+=$$2} END{print c}' $(mk20tab3)) + echo "\newcommand{\menkenumpapers}{$$v}" > $@ + +# Count how many unique journals there were in the study. Note that +# the `31' comes because we put 10 characters for each numeric column +# and separated the last numeric column from the string column with a +# space. If the number of numeric columns change in the future, the +# `31' also has to change. + v=$$(awk 'BEGIN{FIELDWIDTHS="41 10000"} !/^#/{print $$2}' \ + $(mk20tab3) | uniq | wc -l) + echo "\newcommand{\menkenumjournals}{$$v}" >> $@ + +# Count how many rows the original catalog has. + v=$$(awk '!/^#/{c++} END{print c}' $(mk20tab3)) + echo "\newcommand{\menkenumorigrows}{$$v}" >> $@ diff --git a/reproduce/analysis/make/initialize.mk b/reproduce/analysis/make/initialize.mk index 7e9e938..7f0c514 100644 --- a/reproduce/analysis/make/initialize.mk +++ b/reproduce/analysis/make/initialize.mk @@ -97,11 +97,9 @@ endif # doesn't change anything. ifeq (x$(GROUP-NAME),x) texbtopdir = build -final-paper = paper.pdf else user = $(shell whoami) texbtopdir = build-$(user) -final-paper = paper-$(user).pdf endif texbdir = $(texdir)/$(texbtopdir) tikzdir = $(texbdir)/tikz @@ -139,6 +137,7 @@ curdir := $(shell echo $$(pwd)) # we are also going to overwrite 'TEXINPUTS' just before 'pdflatex'. .ONESHELL: .SHELLFLAGS = -ec +export TERM=xterm export TEXINPUTS := export CCACHE_DISABLE := 1 export PATH := $(installdir)/bin @@ -210,8 +209,11 @@ $(lockdir): | $(bsdir); mkdir $@ # Version and distribution tarball definitions -project-commit-hash := $(shell if [ -d .git ]; then \ - echo $$(git describe --dirty --always --long); else echo NOGIT; fi) +project-commit-hash := $(shell \ + if [ -d .git ]; then \ + export LD_LIBRARY_PATH="$(installdir)/lib"; \ + echo $$($(installdir)/bin/git describe --dirty --always --long); \ + else echo NOGIT; fi) project-package-name := maneaged-$(project-commit-hash) project-package-contents = $(texdir)/$(project-package-name) @@ -287,15 +289,19 @@ $(project-package-contents): paper.pdf | $(texdir) dir=$@ rm -rf $$dir mkdir $$dir + curdir=$$(pwd) # Build a small Makefile to help in automatizing the paper building # (including the bibliography). m=$$dir/Makefile echo "paper.pdf: paper.tex paper.bbl" > $$m - printf "\tpdflatex -shell-escape -halt-on-error paper\n" >> $$m + printf "\tlatex -shell-escape -halt-on-error paper\n" >> $$m + printf "\tlatex -shell-escape -halt-on-error paper\n" >> $$m + printf "\tdvips paper.dvi\n" >> $$m + printf "\tps2pdf -dNOSAFER paper.ps\n" >> $$m echo "paper.bbl: tex/src/references.tex" >> $$m - printf "\tpdflatex -shell-escape -halt-on-error paper\n" >> $$m - printf "\tbiber paper\n" >> $$m + printf "\tlatex -shell-escape -halt-on-error paper\n" >> $$m + printf "\tbibtex paper\n" >> $$m echo ".PHONY: clean" >> $$m echo "clean:" >> $$m printf "\trm -f *.aux *.auxlock *.bbl *.bcf\n" >> $$m @@ -321,7 +327,7 @@ $(project-package-contents): paper.pdf | $(texdir) # To keep the sub-directory structure, we are packaging the files # with Tar, piping it, and unpacking it in the archive directory. So # afterwards we need to come back to the current directory. - tar -c -f - $$(git ls-files reproduce tex/src) \ + tar -c -f - $$(git ls-files peer-review reproduce tex/src) \ | (cd $$dir ; tar -x -f -) cd $(curdir) @@ -335,6 +341,8 @@ $(project-package-contents): paper.pdf | $(texdir) # using Bash's extended globbing ('extglob') for excluding this # directory. shopt -s extglob + cp -r tex/img $$dir/tex/img + cp tex/tikz/*.eps $$dir/tex/tikz cp -r tex/build/!($(project-package-name)) $$dir/tex/build # Clean up the $(texdir)/build* directories in the archive (when @@ -362,8 +370,8 @@ $(project-package-contents): paper.pdf | $(texdir) # problems on the arXiv server. cp tex/build/build/paper.bbl $$dir/ tltopdir=.local/texlive/maneage/texmf-dist/tex/latex - find $$tltopdir/biblatex/ -maxdepth 1 -type f -print0 \ - | xargs -0 cp -t $$dir + #find $$tltopdir/biblatex/ -maxdepth 1 -type f -print0 \ + # | xargs -0 cp -t $$dir # Just in case the package users want to rebuild some of the figures # (manually un-comment the 'makepdf' command we commented above), @@ -375,7 +383,8 @@ $(project-package-contents): paper.pdf | $(texdir) # PROJECT SPECIFIC # ---------------- # Put any project-specific distribution steps here. - + cd $$curdir + cp tex/build/build/appendix.bbl $$dir/ # ---------------- # Clean temporary files that may have been created by text editors. @@ -514,6 +523,11 @@ $(mtexdir)/initialize.tex: | $(mtexdir) echo "\newcommand{\projectgitrepo}{$(metadata-git-repository)}" >> $@ echo "\newcommand{\projectcopyrightowner}{$(metadata-copyright-owner)}" >> $@ + # arXiv/Zenodo identifier (necessary for download link): + echo "\newcommand{\projectarxivid}{$(metadata-arxiv)}" >> $@ + v=$$(echo $(metadata-doi-zenodo) | sed -e's/\./ /g' | awk '{print $$NF}') + echo "\newcommand{\projectzenodoid}{$$v}" >> $@ + # Calculate the latest Maneage commit used to build this project: # - The project may not have the 'maneage' branch (for example # after cloning from a fork that didn't include it!). In this diff --git a/reproduce/analysis/make/paper.mk b/reproduce/analysis/make/paper.mk index 740dc7d..da2702c 100644 --- a/reproduce/analysis/make/paper.mk +++ b/reproduce/analysis/make/paper.mk @@ -18,6 +18,7 @@ + # LaTeX macros for paper # ---------------------- # @@ -44,7 +45,7 @@ $(mtexdir)/project.tex: $(mtexdir)/verify.tex # If no PDF is requested, or if LaTeX isn't available, don't continue # to building the final PDF. Otherwise, merge all the TeX macros into # one for building the PDF. - @if [ -f .local/bin/pdflatex ] && [ x"$(pdf-build-final)" = xyes ]; then + @if [ -f .local/bin/latex ] && [ x"$(pdf-build-final)" = xyes ]; then # Put a LaTeX input command for all the necessary macro files. # 'hardware-parameters.tex' is created in 'configure.sh'. @@ -54,6 +55,11 @@ $(mtexdir)/project.tex: $(mtexdir)/verify.tex echo "\input{tex/build/macros/$$t.tex}" >> $$projecttex done +# Possibly print the appendix in the final PDF. + if [ x"$(separatesupplement)" = x1 ]; then + echo "\newcommand{\separatesupplement}{}" >> $$projecttex + fi + # Possibly highlight the '\new' parts of the text. if [ x"$(highlightnew)" = x1 ]; then echo "\newcommand{\highlightnew}{}" >> $$projecttex @@ -95,24 +101,39 @@ $(mtexdir)/project.tex: $(mtexdir)/verify.tex # The bibliography # ---------------- # -# We need to run the 'biber' program on the output of LaTeX to generate the -# necessary bibliography before making the final paper. So we'll first have -# one run of LaTeX (similar to the 'paper.pdf' recipe), then 'biber'. +# We need to run the 'bibtex' program on the output of LaTeX to generate +# the necessary bibliography before making the final paper. So we'll first +# have one run of LaTeX (similar to the 'paper.pdf' recipe), then 'bibtex'. # # NOTE: '$(mtexdir)/project.tex' is an order-only-prerequisite for # 'paper.bbl'. This is because we need to run LaTeX in both the 'paper.bbl' # recipe and the 'paper.pdf' recipe. But if 'tex/src/references.tex' hasn't # been modified, we don't want to re-build the bibliography, only the final # PDF. -$(texbdir)/paper.bbl: tex/src/references.tex $(mtexdir)/dependencies-bib.tex \ - | $(mtexdir)/project.tex +bbls = $(foreach t,$(subst .pdf,,$(top-pdfs)),$(texbdir)/$(t).bbl) +$(bbls): $(texbdir)/%.bbl: tex/src/references.tex \ + $(mtexdir)/dependencies-bib.tex | $(mtexdir)/project.tex + # If '$(mtexdir)/project.tex' is empty, don't build PDF. @macros=$$(cat $(mtexdir)/project.tex) if [ x"$$macros" != x ]; then -# We'll run LaTeX first to generate the '.bcf' file (necessary for -# 'biber') and then run 'biber' to generate the '.bbl' file. +# Unfortunately I can't get bibtex to look into a special directory +# for the references, so we'll copy it into the LaTeX building +# directory. p=$$(pwd) + if ! [ -L $(texbdir)/references.bib ]; then + ln -sf $$p/tex/src/references.tex $(texbdir)/references.bib + fi + +# Copy the improved IEEE bst file into the build directory. The +# improved bst file provides ArXiv clickable URLs and if available, +# open-access URLs based on the DOIs, with closed-access URLs as a +# fallback, via https://oadoi.org . + ln -sf $$p/tex/src/IEEEtran_openaccess.bst $(texbdir)/ + +# We'll run LaTeX first to generate the '.bcf' file (necessary for +# 'bibtex') and then run 'bibtex' to generate the '.bbl' file. export TEXINPUTS=$$p: cd $(texbdir); @@ -122,15 +143,61 @@ $(texbdir)/paper.bbl: tex/src/references.tex $(mtexdir)/dependencies-bib.tex \ # will be built anyway once this rule is done. rm -f $@ +# Put a link to the main LaTeX source that we want to build. + if [ $* = paper ]; then sdir="$$p" + else sdir="$$p"/tex/src + fi + ln -sf "$$sdir"/$*.tex ./ + # The pdflatex option '-shell-escape' is "normally disallowed for # security reasons" according to the 'info pdflatex' manual, but is # enabled here in order to allow the use of PGFPlots. If you do not # use PGFPlots, then you should remove the '-shell-escape' option # for better security. See https://savannah.nongnu.org/task/?15694 # for details. - pdflatex -shell-escape -halt-on-error "$$p"/paper.tex - biber paper + latex -shell-escape -halt-on-error $*.tex + +# When we are building the main paper and the appendices are to be +# built within the main paper's PDF, we need two bibliographies: +# one for the main body, and one for the appendix. For this, we use +# 'multibib'. Multibib creates a separate '.aux' file for each +# bibliography. + bibtex $* + if [ x"$(separatesupplement)" != x1 ]; then + bibtex appendix + fi + +# Hack: tidy up eprint+doi style that didn't work in .bst file. +# TODO (better): read Part 4 of +# http://mirrors.ctan.org/info/bibtex/tamethebeast/ttb_en.pdf and +# fix the .bst style properly. + cp -pv $*.bbl $*-tmp.bbl \ + && sed -e "s/\'/EOLINE/g" $*-tmp.bbl \ + | tr -d '\n' \ + | sed -e 's/\([0-9]\)\( \|EOLINE\)}/\1}/g' \ + | sed -e 's/\([^,]\) *\( \|EOLINE\) *\\eprint/\1, \\eprint/g' \ + | sed -e 's/\([^,]\) *\( \|EOLINE\) *\\doi/\1, \\doi/g' \ + | sed -e 's/EOLINE/\n/g' > $*.bbl + if [ x"$(separatesupplement)" != x1 ]; then + cp -pv appendix.bbl appendix-tmp.bbl \ + && sed -e "s/\'/EOLINE/g" appendix-tmp.bbl \ + | tr -d '\n' \ + | sed -e 's/\([0-9]\)\( \|EOLINE\)}/\1}/g' \ + | sed -e 's/\([^,]\) *\( \|EOLINE\) *\\eprint/\1, \\eprint/g' \ + | sed -e 's/\([^,]\) *\( \|EOLINE\) *\\doi/\1, \\doi/g' \ + | sed -e 's/EOLINE/\n/g' > appendix.bbl + fi + +# Paper-specific hacks for reducing very-long author lists. + cp -pv $*.bbl $*-tmp.bbl \ + && sed -e "s/\'/EOLINE/g" $*-tmp.bbl \ + | tr -d '\n' \ + | sed -e 's;, D\..Chong[^{]*Forstag; et al.\\/;' \ + | sed -e 's;, V\..Khodiyar[^{]*Whyte; et al.\\/;' \ + | sed -e 's/EOLINE/\n/g' > $*.bbl +# The pre-final run of LaTeX after 'paper.bbl' was created. + latex -shell-escape -halt-on-error $*.tex fi @@ -145,7 +212,8 @@ $(texbdir)/paper.bbl: tex/src/references.tex $(mtexdir)/dependencies-bib.tex \ # to run everything cleanly from there, it is necessary to add the current # directory (top project directory) to the 'TEXINPUTS' environment # variable. -paper.pdf: $(mtexdir)/project.tex paper.tex $(texbdir)/paper.bbl +$(top-pdfs): %.pdf: $(mtexdir)/project.tex paper.tex \ + tex/src/appendix-*.tex $(texbdir)/%.bbl # If '$(mtexdir)/project.tex' is empty, don't build the PDF. @macros=$$(cat $(mtexdir)/project.tex) @@ -158,11 +226,17 @@ paper.pdf: $(mtexdir)/project.tex paper.tex $(texbdir)/paper.bbl # See above for a warning and brief discussion on the the pdflatex # option '-shell-escape'. - pdflatex -shell-escape -halt-on-error "$$p"/paper.tex + latex -shell-escape -halt-on-error $*.tex + +# Convert the DVI to PostScript, and the PostScript to PDF. The +# '-dNOSAFER' option to GhostScript allows transparencies in the +# conversion from PostScript to PDF, see +# https://www.ghostscript.com/doc/current/Language.htm#Transparency + dvips $*.dvi + ps2pdf $*.ps # Come back to the top project directory and copy the built PDF # file here. cd "$$p" - cp $(texbdir)/$@ $(final-paper) - + cp $(texbdir)/$*.pdf $@ fi diff --git a/reproduce/analysis/make/top-make.mk b/reproduce/analysis/make/top-make.mk index 4e95c54..7755174 100644 --- a/reproduce/analysis/make/top-make.mk +++ b/reproduce/analysis/make/top-make.mk @@ -64,8 +64,13 @@ include reproduce/software/config/LOCAL.conf # If you are just interested in the processing and don't want to build the # PDF, you can skip the creation of the final PDF by giving a value of # 'yes' to 'pdf-build-final' in 'reproduce/analysis/config/pdf-build.conf'. +ifeq ($(separatesupplement),0) +top-pdfs = paper.pdf +else +top-pdfs = paper.pdf supplement.pdf +endif ifeq (x$(maneage_group_name),x$(GROUP-NAME)) -all: paper.pdf +all: $(top-pdfs) else all: @if [ "x$(GROUP-NAME)" = x ]; then \ @@ -112,7 +117,8 @@ endif # wild-card like the configuration Makefiles). makesrc = initialize \ download \ - delete-me \ + format \ + demo-plot \ verify \ paper diff --git a/reproduce/analysis/make/verify.mk b/reproduce/analysis/make/verify.mk index d3f3282..ac91089 100644 --- a/reproduce/analysis/make/verify.mk +++ b/reproduce/analysis/make/verify.mk @@ -131,16 +131,15 @@ $(mtexdir)/verify.tex: $(foreach s, $(verify-dep), $(mtexdir)/$(s).tex) rm -f $@.tmp # Verify the figure datasets. - $(call verify-txt-no-comments-no-space, \ - $(dm-squared), 6b6d3b0f9c351de53606507b59bca5d1, $@.tmp) - $(call verify-txt-no-comments-no-space, \ - $(dm-img-histogram), b1f9c413f915a1ad96078fee8767b16c, $@.tmp) + $(call verify-txt-no-comments-leading-space, \ + $(a2mk20f1c), 76fc5b13495c4d8e8e6f8d440304cf69) # Verify TeX macros (the values that go into the PDF text). for m in $(verify-check); do file=$(mtexdir)/$$m.tex - if [ $$m == download ]; then s=49e4e9f049aa9da0453a67203d798587 - elif [ $$m == delete-me ]; then s=711e2f7fa1f16ecbeeb3df6bcb4ec705 + if [ $$m == download ]; then s=5d0ab54ca95366d1aab12196966dd3b6 + elif [ $$m == format ]; then s=e04d95a539b5540c940bf48994d8d45f + elif [ $$m == demo-plot ]; then s=48bffe6cf8db790c63a33302d20db77f else echo; echo "'$$m' not recognized."; exit 1 fi $(call verify-txt-no-comments-no-space, $$file, $$s, $@.tmp) |