initial upload
This commit is contained in:
parent
c8b88987e6
commit
32d9ec65c1
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -301,3 +301,6 @@ TSWLatexianTemp*
|
||||||
# Uncomment the next line to have this generated file ignored.
|
# Uncomment the next line to have this generated file ignored.
|
||||||
#*Notes.bib
|
#*Notes.bib
|
||||||
|
|
||||||
|
Makefile
|
||||||
|
latex.mk
|
||||||
|
*.pdf
|
||||||
|
|
39
README.md
39
README.md
|
@ -1,3 +1,40 @@
|
||||||
# logsheet-tex
|
# logsheet-tex
|
||||||
|
|
||||||
Printable logsheet for amateur radio operators in tex
|
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
|
||||||
|
|
11
latex.mk.example
Normal file
11
latex.mk.example
Normal file
|
@ -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)
|
194
logsheet.tex
Normal file
194
logsheet.tex
Normal file
|
@ -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}
|
BIN
sample/logsheet.DL1XXXX.pdf
Normal file
BIN
sample/logsheet.DL1XXXX.pdf
Normal file
Binary file not shown.
Loading…
Reference in a new issue