share
TeX - LaTeXHow to typeset moon phase symbols?
[+40] [4] Ingo
[2011-11-14 12:00:42]
[ symbols ]
[ https://tex.stackexchange.com/questions/34785/how-to-typeset-moon-phase-symbols ]

I would like to add moon phase symbols to a document of mine but could not find a visually pleasing way to do this. Does anyone know how to typeset aesthetic moon phase symbols?

possible duplicate of How to look up a math symbol? - Andrey Vihrov
(2) You can use the unicode symbols (e.g. ☽,☾) if you use a font containing these glyphs. - Marco
[+78] [2011-11-14 13:52:38] Jake [ACCEPTED]

You could use TikZ for drawing the lunar phases. Here's a command \moon{<day>} that takes the day of the lunar month as an argument and draws the corresponding lunar phase. The symbols scale with the surrounding text, normal TikZ options can be passed using the optional argument, and the standard lunar phase names have been defined as additional macros (\waxingcrescent, \fullmoon, etc.). The code uses the method for drawing 3D circles that Andrew Stacey describes in Drawing simple 3D cylinders in TikZ [1].

Edit: I've edited the code to draw the moon more accurately (using a sinusoidal function instead of a linear one). You can now also provide a date to the moon macro for which the moon phase will be drawn. Furthermore, the colour of the moon and the sky can be set using the moon colour and sky colour keys. The key southern hemisphere will flip the diagram vertically.

\foreach \d in {0,2,...,30}{%
    \d: \moon{\d} \\
}


\moon[scale=10]{2011-11-20}


\moon[scale=10,sky colour=blue!50!black,moon colour=yellow,southern hemisphere]{2011-11-20}

\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calendar,fpu}

\tikzset{
    moon colour/.style={
        moon fill/.style={
            fill=#1
        }
    },
    sky colour/.style={
        sky draw/.style={
            draw=#1
        },
        sky fill/.style={
            fill=#1
        }
    },
    southern hemisphere/.style={
        rotate=180
    }
}

\makeatletter
\pgfcalendardatetojulian{2010-01-15}{\c@pgf@counta} % 2010-01-15 07:11 UTC -- http://aa.usno.navy.mil/cgi-bin/aa_moonphases.pl?year=2010&ZZZ=END
\def\synodicmonth{29.530588853}
\newcommand{\moon}[2][]{%
    \edef\checkfordate{\noexpand\in@{-}{#2}}%
    \checkfordate%
    \ifin@%
        \pgfcalendardatetojulian{#2}{\c@pgf@countb}%
        \pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}%
        \pgfmathsetmacro\dayssincenewmoon{\the\c@pgf@countb-\the\c@pgf@counta-(7/24+11/(24*60))}%
        \pgfmathsetmacro\lunarage{mod(\dayssincenewmoon,\synodicmonth)}
        \pgfkeys{/pgf/fpu=false}%%
    \else%
        \def\lunarage{#2}%
    \fi%
    \pgfmathsetmacro\leftside{ifthenelse(\lunarage<=\synodicmonth/2,cos(360*(\lunarage/\synodicmonth)),1)}%
    \pgfmathsetmacro\rightside{ifthenelse(\lunarage<=\synodicmonth/2,-1,-cos(360*(\lunarage/\synodicmonth))}%
    \tikz [moon colour=white,sky colour=black,#1]{
        \draw [moon fill, sky draw] (0,0) circle [radius=1ex];
        \draw [sky draw, sky fill] (0,1ex)
            arc (90:-90:\rightside ex and 1ex)
            arc (-90:90:\leftside ex and 1ex)
            -- cycle;
    }%
}
\newcommand{\newmoon}{\moon{0}}
\newcommand{\waxingcrescent}{\moon{\synodicmonth/8}}
\newcommand{\firstquartermoon}{\moon{2*\synodicmonth/8}}
\newcommand{\waxinggibbous}{\moon{3*\synodicmonth/8}}
\newcommand{\fullmoon}{\moon{4*\synodicmonth/8}}
\newcommand{\waninggibbous}{\moon{5*\synodicmonth/8}}
\newcommand{\thirdquartermoon}{\moon{6*\synodicmonth/8}}
\newcommand{\waningcrescent}{\moon{7*\synodicmonth/8}}
\begin{document}\noindent\raggedleft%
\foreach \d in {0,2,...,30}{%
    \d: \moon{\d} \\
}

\ 

\moon[scale=10]{2011-11-20}

\moon[scale=10,sky colour=blue!50!black,moon colour=yellow,southern hemisphere]{2011-11-20}
\end{document}
[1] https://tex.stackexchange.com/questions/31548/drawing-simple-3d-cylinders-in-tikz/31606#31606

(12) Very nice indeed! - egreg
Could this be changed to use the eTeX \loccount to avoid using global counters? - kahen
(5) Impressive! Have you considered turning this into a package? - doncherry
@kahen: Good point! I've changed the code to use the scratch counts provided by PGF instead of declaring new global counts. - Jake
(1) This totally rocks. As my musician friends would say: "Sick answer, dude!" - Todd Lehman
(1) +1 for having this as a package. (Although I would have to hack this anyway since I want to use it for non-lunar phases, but I still think this should be packaged.) - DevSolar
(1) @DevSolar: I'll try to get on it soon. Might as well start collecting feature requests: By "non-lunar" phases, do you mean you want to be able to use it with periods other than 29.5? Would an option to specify the phase as a fraction or percentage of the period (so 0.5 or 50 would be a full moon) be what you need? - Jake
Correct, I am preparing fantasy-roleplaying material, for a game world with two moons with different periods. But I consider that to be a requirement not common enough for inclusion. (I'm done already, and how many people prepare non-earth-based calendars?) - DevSolar
@Jake: This produces the output shown in the deleted "answer" as opposed to the images shown in your answer. - Peter Grill
@PeterGrill: I fixed the code. For some reason, the syntax \arc [x=..., y=..., start angle=...] doesn't seem to work anymore, I've used the \arc (...:...:...) syntax now - Jake
1
[+25] [2011-11-14 12:13:25] egreg

You can find scores of symbols in the Comprehensive LaTeX Symbol List [1]

For the moon phases you'll find that \usepackage{wasysym} will provide

\fullmoon \leftmoon \newmoon \rightmoon

enter image description here

[1] http://mirrors.ctan.org/info/symbols/comprehensive/symbols-a4.pdf

Nice, but are there any "more fancy" symbols? Or should I consider making them myself, e.g. with TikZ? - Ingo
@tehingo There are some more in the Symbol List, see table 318 page 98. Don't know if those are any close to what you're after though. - Torbjørn T.
2
[+6] [2017-01-03 20:51:22] user122292

The following provides a possible solution using pstricks. Obviously the code is not as powerful as the tikz solution above, but it will get you started. The presentation of this solution is analogous to the one above:

\foreach \d in {0,2,...,30}{%
\d: \moon{\d} \\    }

\newmoon
\waxingcrescent
\firstquartermoon
\waxinggibbous
\fullmoon
\waninggibbous
\thirdquartermoon
\waningcrescent

enter image description here

\documentclass[border=5mm]{standalone}

\usepackage{pstricks}
\usepackage{pst-plot}

\newcommand{\moon}[1]{%
\begingroup%
\psset{unit=1ex}%
\psset{linewidth=0.02em}%
\def\synodicmonth{29.530588853}%
\def\lunarage{#1}%
\edef\waxswitch{\ifdim\lunarage pt>.5\dimexpr\synodicmonth pt 1\else -1\fi}%
\begin{pspicture}[showgrid=false](-1.1,-.65)(1.1,1)%
    \parametricplot[plotpoints=91]{0}{360}{t sin t cos}%
    \pscustom[fillstyle=solid,fillcolor=black]{%
    \parametricplot[plotpoints=91]{\waxswitch\space 180 mul}{0}{t sin t cos}%
    \parametricplot[plotpoints=91]{0}{180}{t sin \lunarage\space \synodicmonth\space div 1 \waxswitch\space add 4 div add 360 mul cos mul t cos}%
    }%end pscustom
\end{pspicture}%
\endgroup%
}%end moon command

\newcommand{\newmoon}{\moon{0}}% following incremented by one 8th of \synodicmonth:
\newcommand{\waxingcrescent}{\moon{3.69}}
\newcommand{\firstquartermoon}{\moon{7.38}}
\newcommand{\waxinggibbous}{\moon{11.07}}
\newcommand{\fullmoon}{\moon{14.77}}
\newcommand{\waninggibbous}{\moon{18.46}}
\newcommand{\thirdquartermoon}{\moon{22.15}}
\newcommand{\waningcrescent}{\moon{25.84}}

\begin{document}
\begin{minipage}{3cm}
\raggedleft
\foreach \d in {0,2,...,30}{%
    \d: \moon{\d} \\    }

\newmoon
\waxingcrescent
\firstquartermoon
\waxinggibbous
\fullmoon
\waninggibbous
\thirdquartermoon
\waningcrescent

\end{minipage}
\end{document}

Thanks again, Jake, for your answer. -- I don't know why, but I get the wrong spacing if the escape-end-of-line-% are omitted in the moon-newcommand. - user122292
(1) Perhaps you don't know about What is the use of percent signs (%) at the end of lines? - Werner
Any ideas how I can get rid of the \pgfmathsetmacro switch? Or is it still acceptable as pstricks solution? - user122292
Try \edef\waxswitch{\ifdim\lunarage pt>.5\dimexpr\synodicmonth pt 1\else -1\fi} - Werner
3
[+3] [2017-01-04 03:22:38] Steven B. Segletes

Here, I create the moon phases using stacks of simple circles and half circles that have been suitably stretched. In my original answer I started with the syntax

\moon{<B/W color at moon center>}{<direction that color proceeds>}{<"fullness">}

This may seem confusing at first, but really isn't. For example, \moon{W}{r}{.2} means that the moon center is white and the right side of the moon is also the same color (white). The fullness is 0.2; a value of 1 gives a full or new moon, and a value of 0 gives a half moon. The value of "fullness" I take as the cosine of the phase.

However, I upgraded the solution by way of EDIT to provide

\Moon{<day>}

to make it easy on the user, which just converts the <day> into the appropriate parameters for \moon.

\documentclass[11pt]{article}
\usepackage{bbding,stackengine,scalerel,xcolor}
\stackMath
\def\BCF{\mkern-1mu\bigcirc\mkern-1mu}
\def\BCW{\scalerel*{$\textcolor{white}{\CircleSolid}$}{\bigcirc}}
\def\BCB{\scalerel*{$\CircleSolid$}{\bigcirc}}
\def\HClB{\scalerel*{$\HalfCircleLeft$}{\bigcirc}}
\def\HCrB{\scalerel*{$\HalfCircleRight$}{\bigcirc}}
\def\HClW{\scalerel*{$\textcolor{white}{\HalfCircleLeft}$}{\bigcirc}}
\def\HCrW{\scalerel*{$\textcolor{white}{\HalfCircleRight}$}{\bigcirc}}
\newcommand\BC[1]{\csname BC#1\endcsname}
\newcommand\HC[2]{\csname HC#1#2\endcsname}
\newcommand\moon[3]{%
  \if W#1\def\tmp{B}\else\def\tmp{W}\fi%
  \stackengine{0pt}{%
    \stackengine{0pt}{%
      \stackengine{0pt}{\BC{\tmp}}{\scalebox{#3}[1]{\BC{#1}}}{O}{c}{F}{F}{L}%
    }{\HC{#2}{#1}}{O}{#2}{F}{F}{L}%
  }{\BCF}{O}{c}{F}{F}{L}
}
\usepackage{fp}
\newcommand\Moon[1]{%
  \FPeval{\thecos}{cos(2*(#1)*pi/29.5)}%
  \ifnum#1<8\relax\def\mcol{B}\def\colyaw{l}\else%
  \ifnum#1<15\relax\def\mcol{W}\def\colyaw{r}\else%
  \ifnum#1<23\relax\def\mcol{W}\def\colyaw{l}\else%
  \ifnum#1<30\relax\def\mcol{B}\def\colyaw{r}\else%  
  \fi\fi\fi\fi%
  \moon{\mcol}{\colyaw}{\thecos}%
}
\begin{document}
\parbox{1in}{%
\texttt{\textbackslash moon\{\}\{\}\{\}}\par
\moon{B}{l}{1.}\par 
\moon{B}{l}{.7}\par
\moon{B}{l}{.5}\par
\moon{B}{l}{.2}\par
\moon{B}{l}{.0}\par
\moon{W}{r}{.2}\par
\moon{W}{r}{.5}\par
\moon{W}{r}{.7}\par
\moon{W}{r}{1.}\par
\moon{W}{l}{.7}\par
\moon{W}{l}{.5}\par
\moon{W}{l}{.2}\par
\moon{W}{l}{.0}\par
\moon{B}{r}{.2}\par
\moon{B}{r}{.5}\par
\moon{B}{r}{.7}\par
}
\parbox{1in}{%
\texttt{\textbackslash Moon\{$<$day$>$\}}\par
0: \Moon{0}\par
2: \Moon{2}\par
4: \Moon{4}\par
6: \Moon{6}\par
8: \Moon{8}\par
10: \Moon{10}\par
12: \Moon{12}\par
14: \Moon{14}\par
16: \Moon{16}\par
18: \Moon{18}\par
20: \Moon{20}\par
22: \Moon{22}\par
24: \Moon{24}\par
26: \Moon{26}\par
28: \Moon{28}\par
30: \Moon{28}\par
}
\end{document} 

enter image description here


4