I am new to TeX and LaTeX and my first project is a very ambitious one. The plan is to use ltxkeys to define database entries for the D&D Role Playing game, and then have LaTeX templates to pretty-print character sheets, monster stats, etc. I've just begun, and have had some success, but I am running into trouble with this test file:

\documentclass[letterpaper,landscape]{article}
\pagestyle{empty}
\usepackage[T1]{fontenc}%Use a modern font encoding
\usepackage[sfdefault]{noto}
\usepackage{anyfontsize}
\usepackage{textpos}
\usepackage[tracingkeys]{ltxkeys}

\setlength{\TPHorizModule}{1in}
\setlength{\TPVertModule}{1in}

\makeatletter
% Monster Tent Graphic is 300 DPI with:
% * image size of (600x2250 pixels) 2in x 7.5in
% * monster title of 630x62 pixels (2.1in x .207in)
% Use a Data Key: \DnD{WUMPUS}{image}
\newcommand{\DnD}[2]
{%
{%
\def\c{#1}
\def\v{#2}
\def\t {\csname DnD@KeyFam@\c \endcsname}%
\csname cmd\t @\c @\v \endcsname%
}%
}

% Define a Creature Data Key:
% \DnDNewCreature{WUMPUS}{title="Grand Wumpus", image=..."}
\newcommand{\DnD@NewCreature}[2]%
{%
\ltxkeys@declarekeys[DnD@Creature]{#1}%
{ cmd/\needvalue{title}//;
cmd/\needvalue{image}//;
}%
\expandafter\def\csname DnD@KeyFam@#1\endcsname{DnD@Creature}%
\ltxkeys@setkeys[DnD@Creature]{#1}{#2}%
}

\def\gimg {img/MM167-Goblin-BW.png}
\DnD@NewCreature{GoblinBoss}{title=Goblin Boss,image=img/MM167-Goblin-BW.png}

\begin{document}%
\def\m {GoblinBoss}%
\begin{figure}[t]%
\begin{minipage}{.25\textwidth}%
% \includegraphics[smash=cc,width=2in,totalheight=2.5in,keepaspectratio,angle=180,hshift=-1.25in,vshift=-2.1in]{\DnD{GoblinBoss}{image}}
\includegraphics[smash=cc,width=2in,totalheight=2.5in,keepaspectratio,angle=180,hshift=-1.25in,vshift=-2.1in]{img/MM167-Goblin-BW.png}%
\includegraphics[smash=cr,totalheight=7.5in,width=2.5in]{img/Monster-Tent.png}%
\begin{textblock}{2.1}(.2,-.42)%
\rotatebox[origin=c]{180}
{\centerline{\fontsize{16}{16}\textbf{\DnD{GoblinBoss}{title}}}}
\end{textblock}
\end{minipage}%
\end{figure}
\end{document}
\makeatother


As is, the file correctly renders the monster tent image and correctly places the desired image and title, however, this is only because the \includegraphics command uses the literal text of the path to the file to load, rather than pulling it out of an ltxkey. If the first commented-out \includegraphics command is used instead of the second, I get an obscure error from inside includegraphics that there is an "Illegal parameter number in definition of \filename@base".

If, instead of the ltxkey, I use \gimg which is just defined to be the image file path, it works. If I try to define \gimg to be {\DnD{GoblinBoss}{image}} enter code here it fails again. If I just print the value of \DnD{GoblinBoss}{image} it appears correct. Any help would be appreciated.

• the argument to \includegraphics has to expand to the filename and your \DnD command does not work by expansion it introduces grouping and local assignment such as \def\c. It also introduces a lot of white space from missing % at ends of lines. Actually it's not clear why you introduce the assignments since they are discarded at the end of the group why not \newcommand{\DnD}[2]{\csname cmd\csname DnD@KeyFam@#1\endcsname@#1@#2\endcsname} – David Carlisle Dec 27 '19 at 23:24
• also any particular reason to use the ltxkeys rather than more standard keyval systems such as keyval or l3keys or pgfkeys? – David Carlisle Dec 27 '19 at 23:26
• beware using one letter commands (or \def) as you have it in a group just for filename use \def\c or \def\t are sort of OK but in most places such a definition would break latex's text encoding support. – David Carlisle Dec 27 '19 at 23:31
• How do I then define a temporary macro that expands to the results of the \DnD command? As for why to use ltxkeys, I was looking for something that could parse sub-expressions like DnDNewCreature{Fish}{stats={str=10,int=14}} – swestrup Dec 28 '19 at 19:32
• doesn't the definition I suggest above work without all the non-expandable grouping and assignment? – David Carlisle Dec 28 '19 at 20:12

You need to define the command such that it expands to the image filename.

\documentclass[letterpaper,landscape]{article}
\pagestyle{empty}
\usepackage[T1]{fontenc}%Use a modern font encoding
\usepackage[sfdefault]{noto}
\usepackage{anyfontsize}
\usepackage{textpos}
\usepackage[tracingkeys]{ltxkeys}

\setlength{\TPHorizModule}{1in}
\setlength{\TPVertModule}{1in}

\makeatletter
% Monster Tent Graphic is 300 DPI with:
% * image size of (600x2250 pixels) 2in x 7.5in
% * monster title of 630x62 pixels (2.1in x .207in)
% Use a Data Key: \DnD{WUMPUS}{image}
{%
{%non expandable group start
\def\c{#1} % non expandable assignment and space token
\def\v{#2} % non expandable assignment and space token
\def\t {\csname DnD@KeyFam@\c \endcsname}% non expandable assignment
\csname cmd\t @\c @\v \endcsname%
}%non expandable group end
}
\newcommand{\DnD}[2]{\csname cmd\csname DnD@KeyFam@#1\endcsname @#1@#2\endcsname}

% Define a Creature Data Key:
% \DnDNewCreature{WUMPUS}{title="Grand Wumpus", image=..."}
\newcommand{\DnD@NewCreature}[2]%
{%
\ltxkeys@declarekeys[DnD@Creature]{#1}%
{ cmd/\needvalue{title}//;
cmd/\needvalue{image}//;
}%
\expandafter\def\csname DnD@KeyFam@#1\endcsname{DnD@Creature}%
\ltxkeys@setkeys[DnD@Creature]{#1}{#2}%
}

\def\gimg {img/MM167-Goblin-BW.png}
\DnD@NewCreature{GoblinBoss}{title=Goblin Boss,image=example-image.png}

\begin{document}%
\def\m {GoblinBoss}%
\begin{figure}[t]%
\begin{minipage}{.25\textwidth}%
\includegraphics[smash=cc,width=2in,totalheight=2.5in,keepaspectratio,angle=180,hshift=-1.25in,vshift=-2.1in]{\DnD{GoblinBoss}{image}}
\includegraphics[smash=cc,width=2in,totalheight=2.5in,keepaspectratio,angle=180,hshift=-1.25in,vshift=-2.1in]{example-image-a.png}%
\includegraphics[smash=cr,totalheight=7.5in,width=2.5in]{example-image-b.png}%
\begin{textblock}{2.1}(.2,-.42)%
\rotatebox[origin=c]{180}
{\centerline{\fontsize{16}{16}\textbf{\DnD{GoblinBoss}{title}}}}
\end{textblock}
\end{minipage}%
\end{figure}
\end{document}
\makeatother this is never executed
`