CindyJS

Texts and Tables

With CindyScript you can produce controlled and styled text for a drawing. The essential functionality is covered by the drawtext operator. Furthermore, with drawtable a table output can be generated. Using texts and tables in scripts is very useful, since one can use the script language to control when and where text is displayed in a construction. This is a very important tool for providing explanatory texts and functional exercises that react to input.

Drawing Text: drawtext(‹vec›,‹expr›)

Description: The drawtext(‹vec›,‹string›) operator plots a text ‹string› at a specified position that is given by the position vector ‹vec›. This position vector can be given either in Euclidean xy-coordinates or in homogeneous coordinates.

Example: The line drawtext((0,0),"Hello World") prints the string “Hello World” with lower left corner at the position (0, 0).

Modifiers: The drawtext operator supports several operators for the modification of appearance and position.

Modifier Parameter Effect
size ‹real› sets the text size
color [‹real›,‹real›,‹real›] sets the text color
alpha ‹real› sets the text opacity
xoffset ‹real› set an x offset in pixels between text and base point
yoffset ‹real› set a y offset in pixels between text and base point
offset [‹real›,‹real›] set an xy offset in pixels between text and base point
align "left", "right", "mid" determines where the text alignment should be
bold ‹bool› flag for bold text
italics ‹bool› flag for italics text
family ‹string› specifying the font family

Besides the available font families also the three strings serif, sansserif and monospaced are allowed, that always produce corresponding standard font types.

Example: The code

x=1..10;
forall(x,i,
  drawtext((i,0),"Text",
  size->2*i+15,
  bold->true,
  color->(1-i/10,0,i/10))
)
fillStyle = "rgba(229,0,25,1)"
font = "bold 17px sans-serif"
fillText("Text", 275.5, 229.5)
fillStyle = "rgba(204,0,51,1)"
font = "bold 19px sans-serif"
fillText("Text", 300.5, 229.5)
fillStyle = "rgba(178,0,76,1)"
font = "bold 21px sans-serif"
fillText("Text", 325.5, 229.5)
fillStyle = "rgba(153,0,102,1)"
font = "bold 23px sans-serif"
fillText("Text", 350.5, 229.5)
fillStyle = "rgba(127,0,127,1)"
font = "bold 25px sans-serif"
fillText("Text", 375.5, 229.5)
fillStyle = "rgba(102,0,153,1)"
font = "bold 27px sans-serif"
fillText("Text", 400.5, 229.5)
fillStyle = "rgba(76,0,178,1)"
font = "bold 29px sans-serif"
fillText("Text", 425.5, 229.5)
fillStyle = "rgba(50,0,204,1)"
font = "bold 31px sans-serif"
fillText("Text", 450.5, 229.5)
fillStyle = "rgba(25,0,229,1)"
font = "bold 33px sans-serif"
fillText("Text", 475.5, 229.5)
fillStyle = "rgba(0,0,255,1)"
font = "bold 35px sans-serif"
fillText("Text", 500.5, 229.5)

produces the picture below.

Image

If the string expression contains a newline chacracter then this line-break is literally interpreted. By this it is easy to produce multilined text, as the following piece of code shows.

drawtext((0,0),size->18,
"In Cinderella 'newlines' in Text
are really used as line terminators.
So this text will appear as a
multilined text.")
fillStyle = "rgb(0,0,0)"
font = "18px sans-serif"
fillText("In Cinderella 'newlines' in Text", 250.5, 229.5)
fillText("are really used as line terminators.", 250.5, 255.6)
fillText("So this text will appear as a", 250.5, 281.7)
fillText("multilined text.", 250.5, 307.8)

Image


Available font families: fontfamilies()

Not available in CindyJS yet!

Description: This operator produces a list of all font families that are available on your computer. Usually this will be quite a lot. The following piece of code displays the names of some of these font families in their own font style.

skip test: fontfamilies() not implemented
families=fontfamilies();
i=0;
while(length(families)>i,i=i+1;
   drawtext((mod(i,5)*7,round(i/5)),families_i,family->families_i);
)

Image


Unicode Characters: unicode(‹string›)

Description: Cinderella can display any Unicode Character in text strings. To access a unicode character the statement unicode(‹string›) accepts a unicode description (a number) given as a string of digits. It returns a string with the corresponding unicode character. By default the base of the unicode description is 16. So hexadecimal descriptions are usually accepted as input. The base can be changed by a modifier.

The base of the unicode description can be changed with the base modifier.

unicode("0041")
"A"
unicode("65",base->10)
"A"
unicode("263a")
"☺"
unicode("1F603")
"😃"

Test whether a string can be displayed: candisplay(‹string›)

Not available in CindyJS yet!

Description: This operator tests, whether a given string can be displayed in the currently chosen font. It returns a boolean value.


Drawing tables: drawtable(‹vec›,‹list›)

One- and two-dimensional lists can be easily drawn in a geometric view as tables. In the simplest form one has only to provide the list and a position where the table should be drawn. Modifiers can be used to fine tune the appearance of the table.

Example: The following code produces the picture below:

x=1..10;
table=apply(x,(#,#^2,#^3,#^4));
drawtable((0,0),table);

Image

Modifiers: The drawtable operator supports several modifiers to control the graphical appearance of the table. A summary of the modifiers is given in the following table:

Modifier Parameter Effect
width ‹int› the width of the cells in pixels
height ‹int› the width of the cells in pixels
flip `` exchanges the role of rows and columns
border ‹bool› turns on/off drawing of lines and borders
size ‹real› sets the text size
color [‹real›,‹real›,‹real›] sets the text color
alpha ‹real› sets the text opacity
offset [‹real›,‹real›] sets an xy offset in pixels between text and base point
align "left", "right", "mid" determines the horizontal text alignment within a cell
back ‹bool› turns on/off the drawing of a table background
back [‹real›,‹real›,‹real›] turns on the drawing of table background and sets it to an RGB color
backalpha ‹real› sets opacity of the table background

Example: The following code is a more elaborate example using the drawtable operator. modifiers are used to create a nice appearance of the tables. A second table is used to create a heading for the table.

skip test: drawtable not implemented yet
x=1..9;
tab=apply(x,(#,#^2,#^3,#^4));
tab1=("x","$x^2$","$x^3$","$x^4$");
linecolor((0,0,.8));
drawtable((0,0),tab,
  width->50,
  height->22,
  back->(1,0,0),
  backalpha->0.1,
  align->"right",
  size->12
);
linecolor((0,0,0));
drawtable((0,8.1),tab1,flip->true,
  width->50,
  height->33,
  back->(0,0,1),
  backalpha->0.4,
  align->"mid",
  size->16,
  color->(1,1,1)
);

Image