12

I want to write some demo code showing code with examples for tikz. However I want the resulting pdf to be automatically depended on the tikz libraries and therefore I must test which are loaded.

Is this functionality implemented in tikz already or can I test for the existence of special commands?

EDIT:

Example which shows that the code does not work outside the preamble. I however need code that works everywhere:

\documentclass[]{scrbook}

\usepackage{pgf}
\usepackage{tikz}

\usetikzlibrary{circuits}

\makeatletter
\newcommand*\@tikzextension{code.tex}
\def\IfTikzLibraryLoaded#1{%
   \@ifl@aded\@tikzextension{tikzlibrary#1}
}
\makeatother

\listfiles

\begin{document}    
\IfTikzLibraryLoaded{circuits}{is loaded}{not loaded}
\end{document}

2 Answers 2

15

When tikz loads the library foo, it defines the macro \tikz@library@foo@loaded. Therefore the following code will do the job:

\makeatletter
\def\IfTikzLibraryLoaded#1{%
  \ifcsname tikz@library@#1@loaded\endcsname
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}
\makeatother
1
  • I made a remix of this solution (thanks!) to make it a one-liner that can go inside the document rather than on the preamble. Here it goes: \def\CheckTikzLibraryLoaded#1{ \ifcsname tikz@library@#1@loaded\endcsname \else \PackageWarning{tikz}{You forgot to add usetikzlibrary{#1} in the preamble!} \fi } \CheckTikzLibraryLoaded{circuits} Oct 20, 2021 at 12:36
8

you can create a new command based on the definition of the command \@ifpackageloaded:

In the example below I provided the new conditional \iftikzlibraryloaded with the syntax:

\iftikzlibraryloaded{<name>}%
 {True Code}%
 {False Code}

Here the complete example:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usetikzlibrary{calc}

\makeatletter
\newcommand*\@tikzextension{code.tex}
\def\iftikzlibraryloaded#1{%
   \@ifl@aded\@tikzextension{tikzlibrary#1}
}
\makeatother
\iftikzlibraryloaded{calc}
 {\def\OUTPUT{calc loaded}}
 {\def\OUTPUT{calc not loaded}}

\begin{document}
\OUTPUT
\end{document}
11
  • You are not using \@ifpackageloaded, at least I see not where. What is \@ifl@aded actually doing and what is your meaning of \@tikzextension ? Is this code working also outside the preamble? Mar 18, 2012 at 9:20
  • @MatthiasPospiech: \@ifpackageloaded is defined as \def\@ifpackageloaded{\@ifl@aded\@pkgextension}. Do you see what I mean?. A library of tikz has the following syntax tikzlibrary<Name of Library>.code.tex and the command \@ifl@aded requires two arguments. The first one is the extension. Mar 18, 2012 at 9:24
  • Ok, but as far as I know \@ifpackageloaded only works in preamble. Mar 18, 2012 at 9:53
  • @MatthiasPospiech: That's right. In the file latex.ltx you can find the relevant part \@onlypreamble\@ifpackageloaded. I don't set this. Mar 18, 2012 at 9:55
  • Ok, so If I use only \@ifl@aded I do not have this proble, correct? Mar 18, 2012 at 10:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.