While the fonts and the respective packages are being built, as pragmatic as it can be, one can get away with the following inline TikZ drawings
\documentclass{article}
\usepackage{tikz}
\newcommand{\dflat}{\tikz[baseline=-1.2mm] \node {\reflectbox{$\flat$}};}
\newcommand{\sflat}{\tikz[baseline=-1.2mm] \node {\reflectbox{$\flat$}$\flat$};}
\newcommand{\dsharp}{\hskip3pt \tikz[baseline=-1.2mm] {%
\clip (-2pt,-6pt) rectangle (-.2pt,6pt); \node at (0,0) {$\sharp$};}\hskip3pt
}
\newcommand{\ssharp}{\tikz[baseline=-1.2mm] {%
\node[inner sep=0mm] at (0,0) {$\sharp$};\node at (1.7pt,0.55pt) {$\sharp$};}
}
\begin{document}
\parbox{5cm}{
This is some random text to use the symbols \dflat, \sflat,\dsharp and \ssharp inline.
It can be improved by assigning some input parameters and adjusting the kerning as
C~{\hskip-7pt\dflat}, A~{\hskip-6pt\dsharp} or D~{\hskip-6pt\ssharp}
}
\end{document}
I will not attempt to make stupid comments since I know almost nothing about typography and kerning but this can be automated at will. Also I am not sure if these commands I have defined are robust. Please consider this as a proof of concept.
Addition by Jake:
By using \tikz [baseline] \node [anchor=base, inner sep=0pt]
, the nodes will automatically be positioned on the text line like a character would, so the vertical position doesn't have to be adjusted manually.
When defining TikZ commands to be used in text lines, it is usually a good idea to specify lengths in terms of ex
and em
, since these depend on the surrounding font size. That way, the symbols will scale with the text.
\documentclass{article}
\usepackage{tikz}
\newcommand{\dflat}{\tikz [baseline] \node [anchor=base, inner sep=0pt] {\reflectbox{$\flat$}};}
\newcommand{\sflat}{\tikz [baseline] \node [anchor=base, inner sep=0pt] {\reflectbox{$\flat$}$\flat$};}
\newcommand{\dsharp}{\tikz [baseline] {%
\clip (-0.2em,-1ex) rectangle (-0.01em,2ex);
\node[anchor=base, inner sep=0pt] {$\sharp$};}
}
\newcommand{\ssharp}{\tikz[baseline] {%
\node[anchor=base,inner sep=0pt,name=leftsharp] at (0,0) {$\sharp$};
\node at (leftsharp.east) [xshift=-0.25em, yshift=0.1ex, inner sep=0pt,anchor=west] {$\sharp$};}
}
\begin{document}
\parbox{5cm}{
This is some random text to use the symbols \dflat, \sflat, \dsharp and \ssharp inline.
It can be improved by assigning some input parameters and adjusting the kerning as
C\dflat, A\dsharp or D\ssharp
}
\parbox{5cm}{\Large
The symbols scale with the text:
C\dflat, A\dsharp or D\ssharp
}
\end{document}
As @rdhs mentioned in his comment, you can use [[...]]
for Lua strings. ConTeXt provides \!!bs ... \!!es
macros that map to [===[ ... ]===]
(this way your string can have literal [[
as well). So, the easiest way to define such a macro is:
\unprotect
\define[2]\showtext
{\startlua
if #1 < 2 then
context(\!!bs#2\!!es)
end
\stoplua}
\protect
Another option is to use commands.doif
series of Lua functions, which follow the same syntax as \doif
series of ConTeXt macros:
\define[1]\showtext{\ctxcommand{doif(#1 < 2)}}
The latter has the advantage of being slightly faster (#2
is not scanned) and slightly more robust, e.g.,
\showtext {5}{\undefined}
works with the second definition but not the first.
Best Answer
Elaborating on @egreg's answer (sorry, too long for a comment): ConTeXt also has the
\asciimode
command. After that, only\
,{
and}
have their typical category codes, all other special characters have catcode 12 (other). In that mode, to type in math, you need to elaborate as in\mathematics{a_2}
(as dollar signs do not work any more) but it is really useful for some types of input file.Special characters input list:
#
is\#
$
is\textdollar
%
is\percent
&
is\&
\
is\textbackslash
^
is\textcircumflex
_
is\textunderscore
{
is\textbraceleft
|
is\textbar
}
is\textbraceright
~
is\textasciitilde
and low-level approaches like
\char`|
or\char`^
also work.