Working version
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
example.log
|
||||
example.aux
|
||||
@@ -1,2 +1,120 @@
|
||||
# foldable-namecard
|
||||
|
||||
This repo contains a quick and easy style file for creating foldable name cards from a CVS input file.
|
||||
A LaTeX package for printing A4 foldable namecards with a name, country, and logo.
|
||||
|
||||
## Requirements
|
||||
|
||||
### Compiler
|
||||
|
||||
**This package requires XeLaTeX.** It will produce a hard error and abort if compiled
|
||||
with `pdflatex` or `lualatex`. The package uses `fontspec` and `xeCJK` for advanced font handling, which are only fully supported by XeLaTeX.
|
||||
|
||||
Compile with:
|
||||
|
||||
```
|
||||
xelatex example.tex
|
||||
```
|
||||
|
||||
### LaTeX Packages
|
||||
|
||||
The following packages are required (most are part of a standard TeX Live or MiKTeX installation):
|
||||
|
||||
- `geometry` - Page layout
|
||||
- `graphicx` - Image handling
|
||||
- `keyval` - Key-value options
|
||||
- `iftex` - Conditional compilation based on engine
|
||||
- `tikz` and `pgf` - Drawing and positioning
|
||||
- `xcolor` - Color support
|
||||
- `fontspec` - Font configuration (XeTeX)
|
||||
- `xeCJK` - CJK character support (for Chinese, Japanese, Korean)
|
||||
|
||||
### System Fonts
|
||||
|
||||
You must install the following fonts on your system:
|
||||
|
||||
| Font | Purpose | Notes |
|
||||
|------|---------|-------|
|
||||
| **Hind** | Primary font for names and text | Download from [Google Fonts](https://fonts.google.com/specimen/Hind) |
|
||||
| **Liberation Sans** or **DejaVu Sans** | Fallback for extended Latin characters (accents, diacritics like ǐ) | Usually pre-installed on Linux/macOS; use one if Hind lacks certain glyphs |
|
||||
| **Noto Sans CJK SC** (or system CJK font) | Chinese character support | For rendering Chinese names |
|
||||
|
||||
#### Installation Instructions
|
||||
|
||||
**macOS:**
|
||||
```bash
|
||||
# Download Hind from Google Fonts, then:
|
||||
cp ~/Downloads/Hind-*.otf ~/Library/Fonts/
|
||||
```
|
||||
|
||||
**Linux (Ubuntu/Debian):**
|
||||
```bash
|
||||
# Install system fonts
|
||||
sudo apt-get install fonts-hind fonts-dejavu fonts-noto-cjk
|
||||
|
||||
# Or manually copy to ~/.fonts/ and run:
|
||||
fc-cache -fv
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
```
|
||||
# Download Hind from Google Fonts
|
||||
# Right-click .otf files → Install
|
||||
```
|
||||
|
||||
If any font is missing, the package will attempt to use fallbacks or emit a warning.
|
||||
|
||||
## Usage
|
||||
|
||||
### Single card
|
||||
|
||||
```latex
|
||||
\documentclass{article}
|
||||
\usepackage{foldable-namecard}
|
||||
|
||||
\namecardsetup{
|
||||
name=Alex Johnson,
|
||||
country=Sweden,
|
||||
logo=mylogo.png
|
||||
}
|
||||
|
||||
\begin{document}
|
||||
\makefoldablenamecard
|
||||
\end{document}
|
||||
```
|
||||
|
||||
### Batch printing from a CSV file
|
||||
|
||||
```latex
|
||||
\documentclass{article}
|
||||
\usepackage{foldable-namecard}
|
||||
|
||||
\namecardsetup{logo=mylogo.png}
|
||||
|
||||
\begin{document}
|
||||
\makefoldablenamecardsfromfile{names.csv}
|
||||
\end{document}
|
||||
```
|
||||
|
||||
The CSV file must contain one `name,country` pair per line. Blank lines are skipped.
|
||||
The package supports international characters including accented Latin letters and Chinese characters.
|
||||
|
||||
```
|
||||
Alex Johnson,Sweden
|
||||
Mina Patel,India
|
||||
Sofia Garcia,Spain
|
||||
Valgerður Ólafsdóttir,Iceland
|
||||
李明 (Lǐ Míng),China
|
||||
王芳,中国
|
||||
```
|
||||
|
||||
## Options (`\namecardsetup`)
|
||||
|
||||
| Key | Default | Description |
|
||||
|----------------|--------------|------------------------------------------|
|
||||
| `name` | `Your Name` | Name printed on the card |
|
||||
| `country` | `Country` | Country printed below the name |
|
||||
| `logo` | *(none)* | Path to logo image file |
|
||||
| `logowidth` | `2cm` | Width of the logo |
|
||||
| `logoheight` | `10mm` | Height constraint for the logo |
|
||||
| `debugboxes` | *(on)* | Show bounding boxes for layout debugging |
|
||||
| `nodebugboxes` | — | Hide bounding boxes |
|
||||
|
||||
BIN
Binary file not shown.
+11
@@ -0,0 +1,11 @@
|
||||
% Compile with: xelatex example.tex
|
||||
\documentclass{article}
|
||||
\usepackage{foldable-namecard}
|
||||
|
||||
\namecardsetup{
|
||||
logo=isoclogo.png
|
||||
}
|
||||
|
||||
\begin{document}
|
||||
\makefoldablenamecardsfromfile{names.csv}
|
||||
\end{document}
|
||||
@@ -0,0 +1,185 @@
|
||||
\NeedsTeXFormat{LaTeX2e}
|
||||
\ProvidesPackage{foldable-namecard}[2026/07/01 A4 foldable namecard]
|
||||
|
||||
\RequirePackage[a4paper,margin=0mm]{geometry}
|
||||
\RequirePackage{graphicx}
|
||||
\RequirePackage{keyval}
|
||||
\RequirePackage{iftex}
|
||||
\RequirePackage{tikz}
|
||||
\usetikzlibrary{calc}
|
||||
\RequirePackage{xcolor}
|
||||
|
||||
\ifXeTeX\else
|
||||
\PackageError{foldable-namecard}{%
|
||||
This package requires XeLaTeX.\MessageBreak
|
||||
Please compile with xelatex instead of lualatex or pdflatex%
|
||||
}{%
|
||||
Compilation will abort. Re-run with: xelatex <your-file>.tex%
|
||||
}%
|
||||
\stop
|
||||
\fi
|
||||
|
||||
\tracinglostchars=0 % Suppress warnings about missing glyphs
|
||||
|
||||
\RequirePackage{fontspec}
|
||||
\IfFontExistsTF{Hind}{%
|
||||
\setmainfont{Hind}[
|
||||
BoldFont = Hind-Bold,
|
||||
UprightFont = Hind-Regular,
|
||||
SemiBoldFont = Hind-SemiBold,
|
||||
]%
|
||||
% Try multiple font options for fallback support
|
||||
\IfFontExistsTF{Liberation Sans}{%
|
||||
\newfontfamily\NC@namefont{Liberation Sans}[
|
||||
BoldFont = Liberation Sans Bold,
|
||||
]%
|
||||
}{%
|
||||
\IfFontExistsTF{DejaVu Sans}{%
|
||||
\newfontfamily\NC@namefont{DejaVu Sans}[
|
||||
BoldFont = DejaVu Sans Bold,
|
||||
]%
|
||||
}{%
|
||||
\let\NC@namefont\relax
|
||||
}%
|
||||
}%
|
||||
}{%
|
||||
\PackageWarningNoLine{foldable-namecard}{Hind font not found; using default font}%
|
||||
}
|
||||
\ifXeTeX
|
||||
\RequirePackage{xeCJK}
|
||||
\setCJKmainfont[
|
||||
BoldFont = RODE Noto Sans CJK SC B,
|
||||
]{RODE Noto Sans CJK SC R}
|
||||
\fi
|
||||
|
||||
\makeatletter
|
||||
|
||||
\newsavebox{\NC@namebox}
|
||||
|
||||
\newcommand\NC@name{Your Name}
|
||||
\newcommand\NC@country{Country}
|
||||
\newcommand\NC@logo{}
|
||||
\newlength\NC@logoheight
|
||||
\newlength\NC@logowidth
|
||||
\newif\ifNC@debugboxes
|
||||
|
||||
%\NC@debugboxestrue
|
||||
\setlength\NC@logoheight{10mm}
|
||||
\setlength\NC@logowidth{2cm}
|
||||
|
||||
\define@key{NC}{name}{\renewcommand\NC@name{#1}}
|
||||
\define@key{NC}{country}{\renewcommand\NC@country{#1}}
|
||||
\define@key{NC}{logo}{\renewcommand\NC@logo{#1}}
|
||||
\define@key{NC}{logoheight}{\setlength\NC@logoheight{#1}}
|
||||
\define@key{NC}{logowidth}{\setlength\NC@logowidth{#1}}
|
||||
\define@key{NC}{debugboxes}[true]{\NC@debugboxestrue}
|
||||
\define@key{NC}{nodebugboxes}[true]{\NC@debugboxesfalse}
|
||||
|
||||
\newcommand{\namecardsetup}[1]{%
|
||||
\setkeys{NC}{#1}%
|
||||
}
|
||||
|
||||
\newcommand{\NC@dbgbox}[1]{%
|
||||
\ifNC@debugboxes
|
||||
\fbox{#1}%
|
||||
\else
|
||||
#1%
|
||||
\fi
|
||||
}
|
||||
|
||||
\newcommand{\NC@renderlogo}{%
|
||||
\ifx\NC@logo\@empty
|
||||
% No logo configured.
|
||||
\else
|
||||
\begingroup
|
||||
\edef\NC@logofile{\NC@logo}%
|
||||
\IfFileExists{\NC@logofile}{%
|
||||
\NC@dbgbox{\includegraphics[width=\NC@logowidth,keepaspectratio]{\NC@logofile}}%
|
||||
}{%
|
||||
\fbox{\parbox[c][\NC@logoheight][c]{5cm}{\centering Logo file not found}}%
|
||||
}%
|
||||
\endgroup
|
||||
\fi
|
||||
}
|
||||
|
||||
\newcommand{\NC@panelcontent}{%
|
||||
\NC@dbgbox{%
|
||||
\begin{minipage}[c][0.92\paperwidth][c]{0.98\paperheight}
|
||||
\centering
|
||||
|
||||
% Measure height of name resized to 25cm width
|
||||
\savebox{\NC@namebox}{%
|
||||
\resizebox{0.95\linewidth}{!}{\bfseries\ifx\NC@namefont\relax\NC@name\else{\NC@namefont\NC@name}\fi}%
|
||||
}%
|
||||
% If height > 4cm, scale down to 4cm; otherwise use 25cm version
|
||||
\ifdim\ht\NC@namebox>4cm
|
||||
{\NC@dbgbox{\makebox[0.95\linewidth][c]{\resizebox{!}{4cm}{\bfseries\ifx\NC@namefont\relax\NC@name\else{\NC@namefont\NC@name}\fi}}}}%
|
||||
\else
|
||||
{\NC@dbgbox{\makebox[0.95\linewidth][c]{\usebox{\NC@namebox}}}}%
|
||||
\fi\par
|
||||
\vspace{5mm}
|
||||
{\NC@dbgbox{\makebox[0.9\linewidth][c]{\resizebox{!}{7.5mm}{\large \NC@country}}}\par}
|
||||
\end{minipage}%
|
||||
}%
|
||||
}
|
||||
|
||||
\ExplSyntaxOn
|
||||
\seq_new:N \l_nc_fields_seq
|
||||
\ior_new:N \l_nc_input_ior
|
||||
|
||||
\cs_new_protected:Npn \NC_process_csv_line:n #1
|
||||
{
|
||||
\tl_set:Nn \l_tmpa_tl {#1}
|
||||
\tl_trim_spaces:N \l_tmpa_tl
|
||||
\tl_if_blank:VTF \l_tmpa_tl
|
||||
{ }
|
||||
{
|
||||
\seq_set_split:NnV \l_nc_fields_seq { , } \l_tmpa_tl
|
||||
\seq_pop_left:NN \l_nc_fields_seq \l_tmpa_tl
|
||||
\tl_trim_spaces:N \l_tmpa_tl
|
||||
\seq_pop_left:NN \l_nc_fields_seq \l_tmpb_tl
|
||||
\tl_trim_spaces:N \l_tmpb_tl
|
||||
\typeout{===\ Printing\ namecard:\ \l_tmpa_tl,\ \l_tmpb_tl\ ===}
|
||||
\namecardsetup{name=\l_tmpa_tl,country=\l_tmpb_tl}
|
||||
\NC@renderpage
|
||||
\newpage
|
||||
}
|
||||
}
|
||||
|
||||
\NewDocumentCommand{\makefoldablenamecard}{ }
|
||||
{
|
||||
\NC@renderpage
|
||||
\newpage
|
||||
}
|
||||
|
||||
\NewDocumentCommand{\makefoldablenamecardsfromfile}{m}
|
||||
{
|
||||
\ior_open:Nn \l_nc_input_ior {#1}
|
||||
\ior_map_inline:Nn \l_nc_input_ior
|
||||
{ \NC_process_csv_line:n {##1} }
|
||||
\ior_close:N \l_nc_input_ior
|
||||
}
|
||||
\ExplSyntaxOff
|
||||
|
||||
\newcommand{\NC@renderpage}{%
|
||||
\thispagestyle{empty}%
|
||||
\begin{tikzpicture}[remember picture,overlay]
|
||||
% Fold guide at the center of the A4 page (parallel to long edge).
|
||||
\draw[dashed,gray!70,line width=0.4pt]
|
||||
([xshift=0.5\paperwidth]current page.south west) --
|
||||
([xshift=0.5\paperwidth]current page.north west);
|
||||
|
||||
% Left panel with text parallel to the long edge.
|
||||
\node[anchor=center] at ([xshift=0.30\paperwidth]current page.west) {\rotatebox{270}{\NC@panelcontent}};
|
||||
|
||||
% Right panel with opposite orientation for the folded side.
|
||||
\node[anchor=center] at ([xshift=0.70\paperwidth]current page.west) {\rotatebox{90}{\NC@panelcontent}};
|
||||
|
||||
% Logos at the outer edges of the page.
|
||||
\node[anchor=west] at ([xshift=10mm]current page.west) {\rotatebox{270}{\NC@renderlogo}};
|
||||
\node[anchor=east] at ([xshift=-10mm]current page.east) {\rotatebox{90}{\NC@renderlogo}};
|
||||
\end{tikzpicture}%
|
||||
\null
|
||||
}
|
||||
|
||||
\makeatother
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,8 @@
|
||||
Alex Johnson,Sweden
|
||||
Mina Patel,India
|
||||
Sofia Garcia,Spain
|
||||
Jan van den Heuvel tot Beichlingen, Netherlands
|
||||
Valgerður Ólafsdóttir, Iceland
|
||||
李明 (Lǐ Míng), China
|
||||
王芳,中国
|
||||
O.K., NL
|
||||
|
Reference in New Issue
Block a user