diff --git a/.gitignore b/.gitignore index 747d42e..cf4603d 100644 --- a/.gitignore +++ b/.gitignore @@ -301,3 +301,6 @@ TSWLatexianTemp* # Uncomment the next line to have this generated file ignored. #*Notes.bib +Makefile +latex.mk +*.pdf diff --git a/README.md b/README.md index 49ac199..ebbe632 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,40 @@ # logsheet-tex -Printable logsheet for amateur radio operators in tex \ No newline at end of file +Printable logsheet for amateur radio operators in tex + +## Description + +With this latex file you can create a print template for an amateur radio +logsheet. By default you fold a DIN A4 paper in half and get four A5 papers in +portrait mode for the logsheet. These A5 sides are all enumerated with the +number as watermark. + +Your callsign can be a watermark across the background. If the sheet is for +trainee logging, there will be "Location+OP" in the heading. + + +## Setup + +### Prepare build system + +* Download Makefile for typesetting LaTeX documents from +[https://github.com/tueda/makefile4latex/](https://github.com/tueda/makefile4latex/raw/refs/heads/master/Makefile) + +Of course you can use your own method of using LaTeX. + +### Config callsign/etc. +* Copy latex.mk.example to latex.mk and adapt it for generating different pdfs +* Config callsign via filename: +** logsheet.DL1XXXX.tex will use callsign DL1XXXX +** logsheet.DN1XXXX.trainee.tex will use callsign DN1XXXX and set Location+OP + in heading (for trainee callsign) +** logsheet.DL1XXXX.tex will use callsign DL1XXXX/t and set Location+OP in + heading (for new (2024) german trainee callsign) +* Configuration in the first section of logsheet.tex possible: +** paper format +** number of logging blocks on each page + +## Build +With the build system: **make pdf** + +Otherwise: build the .tex files as you like diff --git a/latex.mk.example b/latex.mk.example new file mode 100644 index 0000000..c5eb13c --- /dev/null +++ b/latex.mk.example @@ -0,0 +1,11 @@ +PDF_FILES=logsheet.DL1XXXX.pdf logsheet.DN1XXXX.trainee.pdf logsheet.DL1XXXX.traineestroke.pdf + +pdf: $(PDF_FILES) + $(MAKE) mostlyclean + +# create logsheet.CALLSIGN.var.tex from logsheet.tex +logsheet.%.tex: logsheet.tex + cp -v $< $@ + +# clear latex intermediate files for all generated files +srctexfiles += $(PDF_FILES:.pdf=.tex) diff --git a/logsheet.tex b/logsheet.tex new file mode 100644 index 0000000..00e293b --- /dev/null +++ b/logsheet.tex @@ -0,0 +1,194 @@ +% SPDX-License-Identifier: Beerware +% Wolfgang DM5WK Kroener wrote this file. As long as you retain this notice you +% can do whatever you want with this stuff. If we meet some day, and you think +% this stuff is worth it, you can buy me a beer in return. + +\documentclass[12pt]{article} + +% +% configure settings here +% +% configure paperformat here +\def\paper{a4paper} +\newlength{\rowheight} +% configure height of lines +\setlength{\rowheight}{9mm} +% configure number of tables on each page +\def\numtables{2} +% margins of paper defined above +\usepackage[\paper, hmargin=0.7cm, vmargin=0.9cm]{geometry} +% define callsign here or with filename +% e. g. \def\callsign{AB1CD} +% if you define it here, callsign will not be taken from filename +\def\callsign{} +% is this for trainee logging? +% set \trainee to trainee for trainee callsign +% or to traineestroke to get \callsign/T +% if you define it here, trainee will not be taken from filename +\def\trainee{} + +% +% normally no configuration below this line +% + +\usepackage[utf8]{inputenc} +\usepackage{lmodern} + + +\usepackage{tabularray} +\UseTblrLibrary{functional} +\usepackage{functional} +\NewColumnType{Y}{Q[c,m]} +\NewColumnType{Z}{X[c,m]} + +\usepackage{pgffor} +\usepackage{xstring} +\usepackage{fp} +% strip dimension of length and convert to mm +\ExplSyntaxOn +\newcommand\stripdim[1]{\dim_to_decimal_in_unit:nn{#1}{1mm}} +\ExplSyntaxOff + +%split \jobname, extract after first dot callsign, after second dot: trainee +% e. g. for logsheet.AB0CD.trainee.tex extract \callsign as AB0CD and \trainee as trainee +% e. g. for logsheet.AB0CD.tex extract \callsign as AB0CD and \trainee is empty +% put \callsign in watermark and add +OP in heading if \trainee equals trainee +\StrCut{\jobname}{.}\strA\strB +\StrLen{\callsign}[\lenTemp] +\IfEq{\lenTemp}{0}{ + \StrCut{\strB}{.}\callsign\strC +}{ + \StrCut{\strB}{.}\strTemp\strC +} +\StrLen{\trainee}[\lenTemp] +\IfEq{\lenTemp}{0}{ + \StrCut{\strC}{.}\trainee\strD +}{} + +%add /t to callsign if filename is logbool.CALLSIGN.traineestroke.tex +\IfStrEq{\trainee}{\detokenize{traineestroke}}{ + \def\trainee{trainee} + \edef\callsign{\callsign/T} +} + +% default scale if there is no callsign (\wmfontscale\paperwidth) +\FPset\wmfontscale{0.25} + +\StrLen{\callsign}[\callsignlen] +% calculations for callsign as watermark if there is one +\IfEq{\callsignlen}{0}{}{ + % calculate factor for fontsize for diagonal watermark + % (sqrt(w^2+h^2))/(w * factor * callsignlen) + % factor is for callsign going more or less over the whole diagonal + \FPset\w{\stripdim{\paperwidth}} + \FPset\h{\stripdim{\paperheight}} + \FPeval\wmfontscale{root(2,pow(2,h)+pow(2,w))/(w * 0.65 * callsignlen)} + + % calculate angle for diagonal text + \FPeval\diagonalAngle{arctan(h/w) * 180/FPpi} +} + +% pagenumber as watermark +\FPeval\wmfontscalepagenumber{0.75*wmfontscale} +\usepackage[svgnames]{xcolor} +\usepackage{eso-pic} +\usepackage{tikz} +\usetikzlibrary{calc} +\tikzset{every picture/.style={gray, opacity=0.1}} +\newcommand\wmpagenumber{% + \AddToShipoutPictureBG*{% + \begin{tikzpicture}[overlay] + % first pagenumber + \node at ($(current page.north west)!.5!(current page.center)$) + [font=\fontsize{\wmfontscalepagenumber\paperwidth}{\wmfontscalepagenumber\paperwidth}] + {\bfseries\the\numexpr\thepage}; + % then callsign if there is one + \IfEq{\callsignlen}{0}{}{ + \node at (current page.center) + [rotate=\diagonalAngle, font=\fontsize{\wmfontscale\paperwidth}{\wmfontscale\paperwidth}] + {\bfseries\callsign}; + } + %\draw[red,step=1mm] (0,0) grid (40,40); + \end{tikzpicture} + } +} + +% Duplicate page: e. g. two a5 on one a4 +\usepackage{pgfmorepages} +\pgfpagesuselayout{2 on 1}[\paper,landscape] + +\pagestyle{empty} +\setlength\parindent{0pt} + +% calculate, how many lines fit on the paper +\FPset\htext{\stripdim{\textheight}} +\FPset\hlines{\stripdim{\rowheight}} +\FPset\hru{\stripdim{\arrayrulewidth}} +\FPeval\tablelines{trunc((htext/(hlines+hru)), 0)} +\FPeval\tablelinesPlusTwo{round(tablelines + 2, 0)} +\FPeval\tablelinesPlusFour{round(tablelines + 4, 0)} + +% add +OP on trainee sheet +\IfStrEq{\trainee}{\detokenize{trainee}}{ + \def\locationOp{Location+OP} +}{ + \def\locationOp{Location} +} + +% add content of table, create #2 times #1/#2 rows, #1/#2 including two header rows +\prgNewFunction \makerows{mm} { + \tlClear \lTmpaTl + \intZero \lTmpaInt + \intStepInline {1} {1} {#1} { + \boolSet \lTmpaBool {\intCompare {\intMathMod{##1-1}{#1 / #2}} = {0} && \intCompare{#1-##1} > {2}} + \boolVarIfTF \lTmpaBool { + \intZero \lTmpaInt + % heading + \tlPutRight \lTmpaTl {\SetVline[=]{##1}{0pt} \SetCell[r=1,c=5]{valign=m,c} \begin{tblr}{colsep=0pt,width=\textwidth,rows={\rowheight},colspec={X[l,m]Q[r,m]}}Date: \hspace*{4cm} \locationOp: & Mode: \hspace*{2cm} \end{tblr}&&&&& \SetVline[=]{##1}{0pt}\\} + }{ + \intCompareTF {\intMathMod{##1-2}{\intEval{#1 / #2}}} = {0} { + % column descriptions + \tlPutRight \lTmpaTl {Time & Callsign & RST tx & RST rx & Frequency/Name/Location/Notes\\} + }{ + \intIncr \lTmpaInt + % add empty rows with counter + \tlPutRight \lTmpaTl {\hphantom{12345678} & \hphantom{AAA0AAA/AAA0AAA} & & & \SetCell[r=1,c=1]{r} \color{LightGray}} + \tlPutRight \lTmpaTl {\intUse \lTmpaInt} + \tlPutRight \lTmpaTl {\\} + } + } + } + \prgReturn {\expValue{\lTmpaTl}} +} + + +\begin{document} +\ttfamily +\SetTblrInner{rowsep=0pt,rulesep=0pt} +% two sides (front/back) +\foreach \i in {1,2} +{ + % two pages (left/right) + \foreach \j in {1,2} + { + % watermark on every side + \wmpagenumber + \begin{center} + % fix centering + \addtolength{\leftskip} {-2cm} + \addtolength{\rightskip}{-2cm} + + \begin{tblr}[evaluate=\makerows]{ + rows={\rowheight}, + width=\textwidth, + vline{1-Y}={}, + hline{2-Z}={}, + colspec={YYYYZ Q[colsep=0pt]} + } + \makerows{\tablelines}{\numtables} + \end{tblr} + \end{center} + \newpage + } +} +\end{document} diff --git a/sample/logsheet.DL1XXXX.pdf b/sample/logsheet.DL1XXXX.pdf new file mode 100644 index 0000000..ba166c8 Binary files /dev/null and b/sample/logsheet.DL1XXXX.pdf differ