13

Inspired by Paulo Cereda's question here, I would like to draw tally marks using PSTricks (or TikZ, if no one can help with PSTricks).

I have no idea how to start, so I cannot even present a try myself. :( (This is not good, I know!)

What I would like to have, is a command like \tallymarks;

\tallymarks{1} \tallymarks{2} ... \tallymarks{10} 

and get an output like the following:

wanted

without the table and the arabic numerals, i.e., only the tally marks themselves.

Update 1

Inspired by Herbert's idea, here is an attempt to use PSTricks.

\documentclass{article} \usepackage{pstricks-add} \newcommand*{\tallymarksOne}{ \pslineByHand(0,0)(0,1) } \newcommand*{\tallymarksTwo}{ \pslineByHand(0,0)(0,1) \pslineByHand(0.25,0)(0.25,1) } \newcommand*{\tallymarksThree}{ \pslineByHand(0,0)(0,1) \pslineByHand(0.25,0)(0.25,1) \pslineByHand(0.5,0)(0.5,1) } \newcommand*{\tallymarksFour}{ \pslineByHand(0,0)(0,1) \pslineByHand(0.25,0)(0.25,1) \pslineByHand(0.5,0)(0.5,1) \pslineByHand(0.75,0)(0.75,1) } \newcommand*{\tallymarksFive}{ \pslineByHand(0,0)(0,1) \pslineByHand(0.25,0)(0.25,1) \pslineByHand(0.5,0)(0.5,1) \pslineByHand(0.75,0)(0.75,1) \pslineByHand(-0.75,0)(1,1) } \newcounter{TallyTemp} \def\tallymark#1{% \setcounter{TallyTemp}{#1}% \ifnum#1>5 {\Tally E}\addtocounter{TallyTemp}{-5}% \else{\Tally% \ifcase#1\or \tallymarksOne\addtocounter{TallyTemp}{-1}\or \tallymarksTwo\addtocounter{TallyTemp}{-2}\or \tallymarksThree\addtocounter{TallyTemp}{-3}\or \tallymarksFour\addtocounter{TallyTemp}{-4}\or \tallymarksFive\addtocounter{TallyTemp}{-5}% \fi}% \fi% \ifnum\theTallyTemp>0 \expandafter\tallymark\expandafter{\theTallyTemp}\fi } \begin{document} \tallymark{0} \tallymark{1} \tallymark{2} \tallymark{3} \tallymark{4} \tallymark{5} \tallymark{14} \end{document} 

When compiling, I get an error:

! Undefined control sequence. \tallymark ...ounter {TallyTemp}{-5}\else {\Tally \ifcase #1\or \tallymarksO... l.50 \tallymark{0} 

Update 2

Garbage Coloector's hinted me to the following in the PSTricks manual, but the code won't compile:

\documentclass{article} \usepackage{pstricks-add} \def\PstLineFuzzy[#1](#2,#3)(#4,#5)(#6,#7)(#8,#9){% \pscurve[#1](! #2 rand 101 mod 1000 div sub #3 rand 101 mod 1000 div sub) (! #4 rand 101 mod 1000 div sub #5 rand 101 mod 1000 div sub) (! #6 rand 101 mod 1000 div sub #7 rand 101 mod 1000 div sub) (! #8 rand 101 mod 1000 div sub #9 rand 101 mod 1000 div sub)} \def\PstSticks#1{% \multido{\iStick=0+1,\nXA=0.1+0.1,\nXB=-0.5+0.1, \nXC=-0.35+0.10,\nXD=-0.15+0.10}{#1}{% \pst@cnta=\iStick \pst@cnth=\iStick \divide\pst@cnth by 5 \multiply\pst@cnth by 5 \ifnum\iStick>0\relax \ifnum\pst@cnta=\pst@cnth \PstLineFuzzy[linecolor=red]% (\nXB,0.2)(\nXC,0.4)(\nXD,0.6)(\nXA,0.8) \hbox to 0.2\psxunit{} \fi \fi \PstLineFuzzy[](\nXA,0.1)(\nXA,0.4)(\nXA,0.7)(\nXA,1)}} \begin{document} \psset{xunit=0.8,yunit=0.3}% \begin{tabular}{|l|r|p{5.5cm}|} \hline Linux & 27 & \PstSticks{27} \\ \hline Mac OS X & 14 & \PstSticks{14} \\ \hline Windows XP & 43 & \PstSticks{43} \\ \hline \end{tabular} \end{document} 

The error is

! Undefined control sequence. <inserted text> \pst @cnta=\iStick \pst @cnth=\iStick \divide \pst @cnth by ... l.38 & 27 & \PstSticks{27} \\ \hline 
5
  • 2
    Paulo Cereda's question contains a TikZ implementation. Look for \drawvotes macro. Commented Mar 12, 2013 at 8:15
  • 1
    If you need fuzzy lines (to mimic hand made tally marks), invoke texdoc pstricks and read the page 283-284. Commented Mar 12, 2013 at 15:20
  • 1
    \makeatletter ... \makeatother is missing in the new example Commented Mar 12, 2013 at 15:35
  • Your first example is missing the loop. Use my code and replace A by \tallymarksOne B by \tallymarksTwo and so on Commented Mar 12, 2013 at 15:36
  • yes, the complete font setting is not needed, and \Tally is also superfluous. Commented Mar 12, 2013 at 15:49

5 Answers 5

11

with xelatex or lualatex. The font TallyMark is available from http://www.fonts2u.com/tally-mark.font

\documentclass{article} \usepackage{fontspec} \newfontface\Tally{TallyMark} \newcounter{TallyTemp} \def\tallymark#1{% \setcounter{TallyTemp}{#1}% \ifnum#1>5 {\Tally E}\addtocounter{TallyTemp}{-5}% \else{\Tally% \ifcase#1\or A\addtocounter{TallyTemp}{-1}\or B\addtocounter{TallyTemp}{-2}\or C\addtocounter{TallyTemp}{-3}\or D\addtocounter{TallyTemp}{-4}\or E\addtocounter{TallyTemp}{-5}% \fi}% \fi% \ifnum\theTallyTemp>0 \expandafter\tallymark\expandafter{\theTallyTemp}\fi } \begin{document} \tallymark{0} \tallymark{1} \tallymark{2} \tallymark{3} \tallymark{4} \tallymark{5} \tallymark{14} \end{document} 

enter image description here

If you want to use PSTricks then define the commands \ONE, \TWO, ... and draw the lines. Really simple:

\documentclass{article} \usepackage{pstricks-add} \newcommand*\tallymarksOne{\pslineByHand(0,0)(0,1)} \newcommand*\tallymarksTwo{\tallymarksOne\pslineByHand(2pt,0)(2pt,1)} \newcommand*\tallymarksThree{\tallymarksTwo\pslineByHand(4pt,0)(4pt,1)} \newcommand*\tallymarksFour{\tallymarksThree\pslineByHand(6pt,0)(6pt,1)} \newcommand*\tallymarksFive{\tallymarksFour\pslineByHand(-17pt,0)(8pt,1)} \newcounter{TallyTemp} \def\tallymark#1{% \setcounter{TallyTemp}{#1}% \ifnum#1>5 \tallymarksFive\kern14pt \addtocounter{TallyTemp}{-5}% \else% \ifcase#1\or \tallymarksOne\kern3pt \addtocounter{TallyTemp}{-1}\or \tallymarksTwo\kern6pt \addtocounter{TallyTemp}{-2}\or \tallymarksThree\kern9pt \addtocounter{TallyTemp}{-3}\or \tallymarksFour\kern12pt \addtocounter{TallyTemp}{-4}\or \tallymarksFive\kern14pt \addtocounter{TallyTemp}{-5}% \fi% \fi% \ifnum\theTallyTemp>0 \expandafter\tallymark\expandafter{\theTallyTemp}\fi \vspace{1cm} } \begin{document} \tallymark{0}\par \tallymark{1}\par \tallymark{2}\par \tallymark{3}\par \tallymark{4}\par \tallymark{5}\par \tallymark{14} \end{document} 

enter image description here

7
  • \psLineByHand from pstricks-add Commented Mar 12, 2013 at 9:24
  • 1
    then show what you did so far ... Commented Mar 12, 2013 at 11:39
  • 1
    @SvendMortensen: see edited answer. You can define a height for the lines then it is easier to modify. Commented Mar 12, 2013 at 16:08
  • the source code of the manual gets lost in the past. Commented Mar 12, 2013 at 16:14
  • 1
    you should copy my last one which has four vertical lines for the five Commented Mar 12, 2013 at 16:30
8

You need not any special font, any PSTricks, only \pdfliteral:

\newcount\tmpnum \def\tallymarks#1{\leavevmode \lower1bp\vbox to9bp{}% \tmpnum=#1 \loop \ifnum\tmpnum<5 \kern1bp \tallynum\tmpnum \else \tallyV \fi \advance\tmpnum by-5 \ifnum\tmpnum>0 \repeat } \def\tallynum#1{\bgroup\tmpnum=#1\relax \loop \ifnum\tmpnum>0 \kern1bp \tallyI \kern1bp \advance\tmpnum by-1 \repeat \egroup } \def\tallyI{\pdfliteral{q .5 w 0 -1 m 0 8 l S Q}} \def\tallyV{\kern1bp\pdfliteral{q .5 w -1 0 m 9 7 l S Q}\tallynum4\kern1bp } test1: \tallymarks{3} test2: \tallymarks{17} \bye 

tally

0
6

Here is an expl3 approach:

\documentclass{article} \usepackage{xparse} \ExplSyntaxOn \int_new:N \snehal_tally_full_int \int_new:N \snehal_tally_partial_int \box_new:N \snehal_tally_slash_box \cs_generate_variant:Nn \int_step_inline:nnnn { nnVn } \cs_new_protected:Npn \snehal_tally_mark:n #1 { \int_set:Nn \snehal_tally_full_int { \int_div_truncate:nn { #1 } { 5 } } \int_set:Nn \snehal_tally_partial_int { \int_mod:nn { #1 } { 5 } } \int_step_inline:nnVn { 1 } { 1 } \snehal_tally_full_int { \hbox_set:Nn \snehal_tally_slash_box { $\big|$ } \box_rotate:Nn \snehal_tally_slash_box { -70 } \ensuremath { \ooalign { $||||$ \tex_cr:D \hidewidth \tex_raise:D .7ex \box_use:N \snehal_tally_slash_box \hidewidth } }~ } \ensuremath { \int_step_inline:nnVn { 1 } { 1 } \snehal_tally_partial_int { | } } } \NewDocumentCommand \tallymark { m } { \snehal_tally_mark:n { #1 } } \ExplSyntaxOff \begin{document} \tallymark{1001} \end{document} 

enter image description here

0
3

You mentioned that a TikZ solution might be acceptable (if Herbert's excellent answer wasn't present). Also, I prefer the "box method" (I din't know if it has a proper name) for such counting tasks, so I did this here. I don't know if the lines ought to be jittery, it could be added, but so far I did not. The command does not break across lines.

Code

\documentclass[12pt]{article} \usepackage{tikz} \usepackage{xifthen} \begin{document} \newcommand{\tally}[1] { \begin{tikzpicture}[scale=0.5] \pgfmathtruncatemacro{\Rest}{#1} \xdef\GlobalRest{\Rest} \coordinate (temp); \whiledo {\GlobalRest > 9} { \fill (temp) ++ (0.2,0) circle (0.04) ++ (0.5,0) circle (0.04) ++ (0,0.5) circle (0.04) ++ (-0.5,0) circle (0.04); \draw[line cap=round] (temp) ++ (0.2,0) rectangle ++ (0.5,0.5) -- ++ (-0.5,-0.5) ++ (0.5,0) coordinate (temp) -- ++ (-0.5,0.5); \pgfmathtruncatemacro{\Rest}{\GlobalRest-10} %\node[below] at (temp) {\Rest}; \xdef\GlobalRest{\Rest} } \ifthenelse{\GlobalRest > 0} { \fill (temp) ++ (0.2,0) circle (0.04);}{} \ifthenelse{\GlobalRest > 1} { \fill (temp) ++ (0.7,0) circle (0.04);}{} \ifthenelse{\GlobalRest > 2} { \fill (temp) ++ (0.7,0.5) circle (0.04);}{} \ifthenelse{\GlobalRest > 3} { \fill (temp) ++ (0.2,0.5) circle (0.04);}{} \ifthenelse{\GlobalRest > 4} { \draw (temp) ++ (0.2,0) -- ++ (0.5,0);}{} \ifthenelse{\GlobalRest > 5} { \draw (temp) ++ (0.7,0) -- ++ (0,0.5);}{} \ifthenelse{\GlobalRest > 6} { \draw (temp) ++ (0.7,0.5) -- ++ (-0.5,0);}{} \ifthenelse{\GlobalRest > 7} { \draw (temp) ++ (0.2,0.5) -- ++ (0,-0.5);}{} \ifthenelse{\GlobalRest > 8} { \draw (temp) ++ (0.2,0) -- ++ (0.5,0.5);}{} \end{tikzpicture} } \foreach \T in {11,...,20,37,49,54,62,89,243} { Lorem ipsum: \tally{\T} } \end{document} 

Output

enter image description here

1
  • 1
    If you are interested in another tally, here it is Japanese Tally symbol Commented Nov 27, 2015 at 4:48
2

Simplest way I found was to use \usepackage[misc]{ifsym} and then use commands \StrokeFive, \StrokeFour, \StrokeOne, etc. accordingly enter image description here

3
  • Hi and welcome. Can you give a complete code with an example of usage? Commented Aug 28, 2020 at 8:24
  • 1
    Yes, I'm sorry I should've done it in the first place Commented Aug 30, 2020 at 18:58
  • Please don't give the code as a picture, but enter it between the code tags i.e {}, this avoids having to copy it manually and allows copy and paste. Commented Aug 30, 2020 at 19:42

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.