#LyX 2.3 created this file. For more info see http://www.lyx.org/ \lyxformat 544 \begin_document \begin_header \save_transient_properties true \origin unavailable \textclass scrartcl \begin_preamble \usepackage{tikz} \usepackage{pgffor} \end_preamble \options DIV=11 \use_default_options false \maintain_unincluded_children false \language english \language_package default \inputencoding auto \fontencoding global \font_roman "newcent" "default" \font_sans "default" "default" \font_typewriter "default" "default" \font_math "auto" "auto" \font_default_family default \use_non_tex_fonts false \font_sc false \font_osf false \font_sf_scale 100 100 \font_tt_scale 100 100 \use_microtype false \use_dash_ligatures true \graphics default \default_output_format default \output_sync 0 \bibtex_command default \index_command default \paperfontsize default \spacing single \use_hyperref true \pdf_title "Teapot User Guide" \pdf_author "Michael Haardt, Jörg Walter" \pdf_bookmarks true \pdf_bookmarksnumbered true \pdf_bookmarksopen true \pdf_bookmarksopenlevel 2 \pdf_breaklinks false \pdf_pdfborder true \pdf_colorlinks false \pdf_backref false \pdf_pdfusetitle true \papersize default \use_geometry false \use_package amsmath 1 \use_package amssymb 1 \use_package cancel 1 \use_package esint 1 \use_package mathdots 0 \use_package mathtools 1 \use_package mhchem 1 \use_package stackrel 1 \use_package stmaryrd 1 \use_package undertilde 1 \cite_engine basic \cite_engine_type default \biblio_style plain \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false \justification true \use_refstyle 0 \use_minted 0 \index Index \shortcut idx \color #008000 \end_index \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \paragraph_indentation default \is_math_indent 0 \math_numbering_side default \quotes_style english \dynamic_quotes 0 \papercolumns 1 \papersides 1 \paperpagestyle fancy \tracking_changes false \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict false \end_header \begin_body \begin_layout Title Teapot User Guide \end_layout \begin_layout Author Michael Haardt, Jörg Walter, Glen Whitney \end_layout \begin_layout Date \begin_inset CommandInset href LatexCommand href name " http://www.syntax-k.de/projekte/teapot" target "http://www.syntax-k.de/projekte/teapot" literal "false" \end_inset \end_layout \begin_layout Publishers \begin_inset CommandInset href LatexCommand href name "https://code.studioinfinity.org/glen/teapot-spreadsheet" target "https://code.studioinfinity.org/glen/teapot-spreadsheet" literal "false" \end_inset \end_layout \begin_layout Abstract For ages, spreadsheet programs have been closely associated with financial calculations done by typical end-users. But time has shown that there is also hacker's work which can be done with them, like calculate monitor timings for various resolutions, or produce convincing time statistics which justify the lack of documentation or the need for a budget increase to your employer. The first part of this user guide explains how the various operations of teapot are used, whereas the second part gives an introduction to spreadsheets and explains the expression evaluator and its functions and operators. \end_layout \begin_layout Standard \begin_inset CommandInset toc LatexCommand tableofcontents \end_inset \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Section Copyright, Contributors and License \end_layout \begin_layout Standard \noun on teapot \noun default (Table Editor And Planner, Or: Teapot), is copyrighted 1995–2006 by Michael Haardt, and 2009–2010 by Jörg Walter, and 2019 by Glen Whitney, and is licensed under the Gnu General Public License v3 or later. \end_layout \begin_layout Standard The implementation of clocked expressions is modelled after the description of clocked evaluation in the PhD work of Jörg Wittenberger at the University of Technology in Dresden, Germany. The trigonometric functions were inspired by Koniorczyk Mátyás. The context output format was contributed by Marko Schuetz. \end_layout \begin_layout Standard The (currently unused) message catalogs were contributed by Guido Müsch, Wim van Dorst, and Volodymyr M. Lisivka. \end_layout \begin_layout Standard This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. \end_layout \begin_layout Standard This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. \end_layout \begin_layout Standard You should have received a copy of the GNU General Public License v3 along with this program. If not, see < \begin_inset CommandInset href LatexCommand href target "http://www.gnu.org/licenses/" literal "false" \end_inset >. \end_layout \begin_layout Section Introduction to Spreadsheets \end_layout \begin_layout Subsection General Introduction \end_layout \begin_layout Standard A spreadsheet consists of cells formed by rows and columns. Additionally, in many spreadsheets you have a third dimension, which you can imagine as various layers laying on top of each other. The third dimension allows you to hide intermediate results, calculate additional results you do not want to appear in the \begin_inset Quotes eld \end_inset official \begin_inset Quotes erd \end_inset tables, keep information per time period (like 12 layers for each month in a year) while allowing you to make calculations over the entire time interval and much more. Figure \begin_inset CommandInset ref LatexCommand ref reference "fig:Three-Dimensional-Spread-Sheet" \end_inset shows the three dimensions: \end_layout \begin_layout Standard \begin_inset Float figure placement h wide false sideways false status open \begin_layout Plain Layout \align center \begin_inset ERT status open \begin_layout Plain Layout { \backslash color{white} \backslash hrule} \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \backslash begin{tikzpicture}[scale=.1,anchor=west] \end_layout \begin_layout Plain Layout \backslash foreach \backslash z in {0,2,4,6} \backslash filldraw[fill=white,ystep=1,xstep=3,shift={(0,0, \backslash z)}] (0,0) rectangle (60,10) (0,0) grid (60,10); \end_layout \begin_layout Plain Layout \backslash draw[->] (70,10,10) -- +(30,0,0) node{x}; \end_layout \begin_layout Plain Layout \backslash draw[->] (70,10,10) -- +(0,-10,0) node{y}; \end_layout \begin_layout Plain Layout \backslash draw[->] (70,10,10) -- +(0,0,-10) node{z}; \end_layout \begin_layout Plain Layout \backslash end{tikzpicture} \end_layout \begin_layout Plain Layout { \backslash color{white} \backslash hrule} \end_layout \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout \begin_inset CommandInset label LatexCommand label name "fig:Three-Dimensional-Spread-Sheet" \end_inset Three-Dimensional Spread Sheet Layout \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard You can think of cells as variables, which value is the value of an associated expression. The expression may be constant, like 1.23, or it may be a function of other cell values. The advantage compared to a programmable calculator is that if you change a number, you directly see all changes in other cells caused by that. Often this allows you to get a feeling how much you may change basic sizes with still getting satisfying results without having to solve the problem analytically. \end_layout \begin_layout Standard Spreadsheets offer many editing operations in order to modify, clear, copy and move cells or blocks of cells. Besides the usual mathematical functions, there are functions which work on blocks of cells, like calculating the sum of a block or counting all non-empty elements. Further there are functions working on character strings, because most likely you also want text besides numbers. The next section will introduce you to some of these by examples. \end_layout \begin_layout Standard teapot is a traditional spreadsheet and a typical UNIX program, because it does just one thing: Calculations. It does not include any graphics functions and never will, but it allows to export data in many formats, so you can use your favourite graphics software. \end_layout \begin_layout Subsection The First Steps \end_layout \begin_layout Standard Now that you have an idea what teapot is about, it is probably a good time to take your first steps with it. This section will show you how to create and save a sheet which contains two numbers and their sum. Start the program without any arguments \begin_inset Foot status collapsed \begin_layout Plain Layout If you are using the graphical version of teapot, please see section \begin_inset CommandInset ref LatexCommand vref reference "subsec:Differences-Between-User" \end_inset . \end_layout \end_inset : \end_layout \begin_layout Quote \family typewriter teapot \end_layout \begin_layout Standard You see an empty sheet with the cell cursor being at the upper left corner. Further, the status line tells you that this cell is really empty: \end_layout \begin_layout Quote \family typewriter E @(0,0,0)= \family default \end_layout \begin_layout Standard The \family typewriter E \family default means that you can edit the sheet. A \family typewriter V \family default would mean that you could only view its contents. The meaning of \family typewriter @() \family default will be explained soon. You are now in the command mode of teapot. Press the \series bold Enter \series default key to edit this cell. A complete list of command mode operations will be given later. A prompt will appear below the status line: \end_layout \begin_layout Quote \family typewriter Cell contents: \family default \series bold 1 \series default \end_layout \begin_layout Standard Now the cell at position 0,0,0 has the integer constant 1. The status line shows you the cell contents, whereas in the sheet you see its value. Since constants are identical with their values, both are 1. Now move the cell cursor down one row and edit that cell, giving it the integer constant \family typewriter 41 \family default . \end_layout \begin_layout Standard Now that you have two numbers, move the cell cursor to cell 0,2,0 and give that cell the following contents: \end_layout \begin_layout Quote \family typewriter Cell contents: \family default \series bold @(0,0,0)+@(0,1,0) \series default \end_layout \begin_layout Standard If you were confused about the difference between contents and value of a cell, it should become more clear now: The status line shows the contents, which is the arithmetic expression to calculate the sum of two cells, whereas in the sheet you see the value of that expression: 42, which was to be expected. \family typewriter @( \family default \shape italic x \family typewriter \shape default , \family default \shape italic y \family typewriter \shape default , \family default \shape italic z \family typewriter \shape default ) \family default is a function which takes three coordinates and returns the value of the cell at the given position. \end_layout \begin_layout Standard As you can see, the arithmetic expression is not too readable. If you would move cells around, it would not even work any more. For these reasons, you can use symbolic names instead of coordinates, called labels. When used in an expression, a label is like a pointer to a cell, its data type is \emph on location \emph default . Move to cell 0,0,0 and use \series bold / \series default (slash) in command mode to get into the main menu. Depending on your screen size, you may not see all of it. In this case, move the highlighted block right (or left) to scroll through it and to see all items. Now change its label attribute: A)ttributes, L)abel: \end_layout \begin_layout Quote \family typewriter Cell label: \family default \series bold Paper \end_layout \begin_layout Standard Then go one cell down and change its label to \series bold Tapes \series default . After, move again one cell down and change the expression to: \end_layout \begin_layout Quote \family typewriter Cell contents: \family default \series bold @(Paper)+@(Tapes) \end_layout \begin_layout Standard As you see, you can call the function \family typewriter @ \family default with three integer values or with one location value. Now the expression is more understandable, at least to you. To someone else, the sheet only contained three numbers, so a little text should be added. To accomplish that, a new column needs to be inserted: B)lock, I)insert, C)olumn, W)hole column. The last menu item means that you want to insert a whole new column, not only a partial column. If you move the cursor around, you will see that everything is still fine, because you used labels. Go to cell 0,0,0 and edit it: \end_layout \begin_layout Quote \family typewriter Cell contents: \family default \series bold "Paper:" \end_layout \begin_layout Standard This is how you enter strings. A string is a data type on its own, don't confuse this with labels. If you feel like it, leave the quotes and the colon away, and you will see the difference, because the result will not be a string, but the value of the label \family typewriter Paper \family default , which is \family typewriter &(1,0,0) \family default . Now change the cells below to \series bold "Tapes:" \series default and \series bold "Result:" \series default . This is something that is understandable to others, too. \end_layout \begin_layout Standard As the last step, save your work sheet to a file: F)ile, S)ave. The native file format is Teapot ASCII, so choose that. Up to now, your sheet does not have a name, so you will be prompted for one: \end_layout \begin_layout Quote \family typewriter New file name: \family default \series bold firststep \end_layout \begin_layout Standard Unless you see an error message after, your sheet is written to a file. \end_layout \begin_layout Standard If you have come this far, quit (from the main menu) and you have successfully completed your first steps on using teapot. Now you know cells, the difference between contents and values, you learned that labels are a good thing and you can do simple cell modifications as well as saving your work. This is enough for most applications. If the capabilities described in the next section confuse you, then it is unlikely that you need them really. Just skip that section and don't worry about it. \end_layout \begin_layout Standard You may wonder what happens if you have circular dependencies, i.e. you have a cell which evaluates to its own value plus one. Well, the answer is that it depends on the order in which you create this cell. If you first give it the value 1 and after edit it to contain the expression which refers to itself plus 1, then you will find that each recalculation, like after editing other cells, will increase the value. While this may be funny, it is certainly not useful as you can not reset the cell and you have little control of its development. \end_layout \begin_layout Standard What you really want is a base value and an iterative expression along with a way to control the recalculations. teapot supports this by allowing two expressions per cell. The expressions you have used so far are the ones which evaluate to the base values. Each time you edit a cell, the whole sheet will be reset, which means that all results are recalculated using the base values. After, you can clock the sheet, which is why the iterative part is also called clocked expression. A clock is an atomic operation, which means that all cell results will be recalculated in a way that the new result will only show after the entire recalculation. \end_layout \begin_layout Standard An examples will demonstrate how to make use of this feature. The notation \shape italic x \shape default -> \shape italic y \shape default means that \shape italic x \shape default is the base expression and \shape italic y \shape default is the clocked expression. Don't let this confuse you, as both are entered separately: teapot does not have an -> operator, but it displays the cell contents this way so you can easily see both expressions at once. So, give the cell a base expression of \family typewriter 1 \family default and a clocked expression of \family typewriter @(0,0,0)+1 \family default (using \series bold ESC-Enter \series default or \series bold Meta-Enter \series default ) and you will see: \end_layout \begin_layout Quote \family typewriter @(0,0,0)=1 -> @(0,0,0)+1 \end_layout \begin_layout Standard The sheet is currently in reset condition and the result is 1. Now clock it and you will see how the value increases. \end_layout \begin_layout Standard After this introductory chapter, you should be familiar with the basic concepts in spread sheets. The next chapters explain all operations available in detail. You should read them to get an overview of the possibilities offered by teapot. Finally, we will come back to using teapot by showing some common problems and their solutions. \end_layout \begin_layout Subsection \begin_inset CommandInset label LatexCommand label name "subsec:Differences-Between-User" \end_inset Differences Between User Interfaces \end_layout \begin_layout Standard \noun on teapot \noun default comes in two flavours: A mouse-and-keyboard operated graphical application and a traditional console-based program. Large parts of this manual were written when the GUI version didn't exist, so there may be occasional inconsistencies. Note that the executable name for the graphical version of teapot is typically \family typewriter fteapot \family default , so to follow the tutorial above with the GUI version, start with that command instead of \family typewriter teapot \family default . \end_layout \begin_layout Standard Most notably, a few key bindings don't exist. If something doesn't work as described in here, refer to the pull-down menus, where all operations can be found. In addition to the common keys, the GUI variant has extended mouse and keyboard bindings that work similarly to other GUI applications. The table in the following section attempts to summarize all bindings from both variants. \end_layout \begin_layout Section Command Mode \end_layout \begin_layout Standard Right after starting teapot, you are in the command mode. Many operations from the command mode are also available from menus, but using keys is faster and some things, like moving the cell cursor, are only available through keys. Tables \begin_inset CommandInset ref LatexCommand vref reference "tab:Key-Bindings-in" \end_inset through \begin_inset CommandInset ref LatexCommand vref reference "tab:Key-Bindings-in-2" plural "false" caps "false" noprefix "false" \end_inset list all available key bindings \begin_inset Foot status collapsed \begin_layout Plain Layout If you are using the graphical version of teapot, please see section \begin_inset CommandInset ref LatexCommand vref reference "subsec:Differences-Between-User" \end_inset . \end_layout \end_inset . If a binding is only available in the console variant, it is enclosed in square brackets; if the binding only works in the graphical variant, it is in curly braces (the mnemonic for this notation is that square brackets are \begin_inset Quotes eld \end_inset plain \begin_inset Quotes erd \end_inset and curly braces are \begin_inset Quotes eld \end_inset fancy \begin_inset Quotes erd \end_inset ). \end_layout \begin_layout Standard \begin_inset Float table placement !tbh wide false sideways false status open \begin_layout Plain Layout \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout \series bold Cursor Motions \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Function Key \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout ASCII Key \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Operation \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Next Character/Right Arrow \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-F] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Right \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Prev. Character/Left Arrow \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-B] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Left \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Next Line/Down Arrow \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-N] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Down \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Previous Line/Up Arrow \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-P] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Up \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Shift-PageDown} \end_layout \begin_layout Plain Layout {Click on right of layer number} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [+] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Next Layer \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Shift-PageUp} \end_layout \begin_layout Plain Layout {Click on left of layer number} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout - (Dash/Minus) \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Previous Layer \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Begin/Home \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-A] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout To column 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout End \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-E] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout To last column \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Ctrl-Home} {Ctrl-PageUp} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [<] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout To row 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Ctrl-End} {Ctrl-PageDown} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [>] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout To last row \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Shift-Home} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [_ (Underscore)] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout To Layer 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Shift-End} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [*] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout To last layer \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-X >] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Jump one page right \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-X >] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Jump one page left \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout PageDown {Ctrl-Down} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-V] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Jump one page down \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout PageUp {Ctrl-Up} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Meta-V] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Jump one page up \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Ctrl-G} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Go to arbitrary location \end_layout \end_inset \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout \begin_inset CommandInset label LatexCommand label name "tab:Key-Bindings-in" \end_inset Cursor Motion Key Bindings in Command Mode \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset Float table placement !tbh wide false sideways false status open \begin_layout Plain Layout \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout \series bold Program Control \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Function Key \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout ASCII Key \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Operation \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout F10 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [/] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Main menu \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout F3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-X Ctrl-S] {Ctrl-S} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Save sheet \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Ctrl-Shift-S} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Save sheet as... \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Esc z] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Save sheet and quit \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout F2 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-X Ctrl-R] {Ctrl-O} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Load sheet \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Meta-F} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Activate File menu \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Meta-V} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Activate View menu \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Meta-O} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Activate fOrmat menu \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Meta-H} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Activate Help menu \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Ctrl-L \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Redraw screen \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-C] [Ctrl-G] {Esc} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Abort current action \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Cancel \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-X Ctrl-C] {Ctrl-Q} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Quit \end_layout \end_inset \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout \begin_inset CommandInset label LatexCommand label name "tab:Key-Bindings-in-1" \end_inset Program Control Key Bindings in Command Mode \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset Float table placement !tbh wide false sideways false status open \begin_layout Plain Layout \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout \series bold Modify Cells/Blocks \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Function Key \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout ASCII Key \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Operation \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Enter \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-J] [Ctrl-M] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Edit cell contents \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Backspace \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-H] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Edit cell and delete last character \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \begin_inset Quotes eld \end_inset , @, \emph on digit \emph default , \emph on letter \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Overwrite cell contents \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Meta-Enter \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Esc Ctrl-J] [Esc Ctrl-M] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Edit clocked cell contents \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout . (Period) \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Start/End Mark block (see text) \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Shift-Right} {Shift-Left} \end_layout \begin_layout Plain Layout {Shift-Down} {Shift-Up} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Start Mark and Move \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Ctrl-Insert} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Ctrl-C} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Copy cell/text/block; End Mark \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Shift-Delete} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Ctrl-X} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Designate block for moving; End Mark \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Shift-Insert} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-Y] {Ctrl-V} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Paste/move block \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Delete} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Clear block \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Meta-A} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Set cell label \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Meta-B} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Toggle cell/block bold \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Meta-U} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Toggle cell/block underlined \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Meta-L} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Make cell/block left justified \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Meta-C} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Make cell/block centered \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Meta-R} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Make cell/block right justified \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Meta-P} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Set cell/block precision \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Meta-W} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Set column width \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Meta-E} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Toggle cell/block shadowed \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Meta-T} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Toggle cell/block transparent \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Meta-I} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Toggle cell/block ignored \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Ctrl-R \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Reset sheet \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout F9, {Shift-Tab} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-S] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Clock sheet \end_layout \end_inset \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout \begin_inset CommandInset label LatexCommand label name "tab:Key-Bindings-in-2" \end_inset Key Bindings that Modify Cells in Command Mode \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard One command-mode key in particular needs additional explanation. The . (Period) marks blocks: The first time it is pressed marks the beginning of a block, which is then extended by moving the cell cursor. The next time, it marks the end of the block which lets you move the cell cursor after without changing the block. The third time, it removes the block marks again. \end_layout \begin_layout Section The Line Editor \end_layout \begin_layout Standard Many operations in teapot require editing a line of text, e.g. editing cell contents, typing file names and the like. Similar to the command mode, all things can be reached by control codes and most by function keys. Table \begin_inset CommandInset ref LatexCommand vref reference "tab:Key-Bindings-forLineEditor" \end_inset lists all available key bindings, again with brackets for those keys that only work in the console variant and curly braces for the graphical variant. \end_layout \begin_layout Standard \begin_inset Float table wide false sideways false status open \begin_layout Plain Layout \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout Function Key \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout ASCII Key \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Operation \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Previous Character/Left Arrow \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-B] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Move cursor left \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Next Character/Right Arrow \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-F] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Move cursor right \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Begin/Home \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-A] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Move cursor to column 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout End \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-E] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Move cursor to last column \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Enter \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-J] [Ctrl-M] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Finish editing/accept line \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Ctrl-L \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Redraw screen \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-T] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Transpose characters \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl- \backslash ] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Go to matching paren \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Cancel [Up Arrow] {Esc} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-G] [Ctrl-C] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Abort editing \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Backspace \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-H] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Delete previous character \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-K] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Delete rest of line \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Delete \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-?] [Ctrl-D] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Delete current character \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Tab] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout File name completion \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Insert \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Toggle insert mode \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout {Tab} \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout [Ctrl-O] \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout Toggle motion in sheet (see text) \end_layout \end_inset \end_inset \end_layout \begin_layout Plain Layout \begin_inset Caption Standard \begin_layout Plain Layout \begin_inset CommandInset label LatexCommand label name "tab:Key-Bindings-forLineEditor" \end_inset Key Bindings for the line editor \end_layout \end_inset \end_layout \end_inset \end_layout \begin_layout Standard Besides the regular line editor operations, you may use Ctrl-O (Tab in the GUI version) to temporarily leave the editor in order to move around in the sheet if you are editing cell contents. Another Ctrl-O (resp. Tab) brings you back to the line editor. While moving around in the sheet, you can insert the value (v) or position (p) at the cursor position in the edited cell. Clicking on a cell while editing has the same effect as moving to that cell and pressing (p). \end_layout \begin_layout Standard Aborting line editing means that you will return immediately to command mode; whatever you started doing will have no effect. \end_layout \begin_layout Section Interactive Operations \end_layout \begin_layout Standard Most actions are available through the menu. Most of these will be applied to all cells within a block if a block of cells is marked. \end_layout \begin_layout Subsection \begin_inset CommandInset label LatexCommand label name "subsec:Cell-Attributes" \end_inset Cell Attributes \end_layout \begin_layout Standard Cells can have several attributes: \end_layout \begin_layout Itemize A cell label, which is useful because it avoids the need to directly address cells by their position, and because it continues to work if the cell is moved or if parts of the spreadsheet are inserted or deleted. A cell label must be different from any of the function names. \end_layout \begin_layout Itemize The cell adjustment, which determines if the cell value is printed left adjusted, right adjusted or centered. \end_layout \begin_layout Itemize Text attributes, such as bold or underlined. \end_layout \begin_layout Itemize The precision for the output of floating point values. The default is 2 digits after the dot. \end_layout \begin_layout Itemize The format for floating point numbers when they are printed. This can be \begin_inset Quotes eld \end_inset decimal \begin_inset Quotes erd \end_inset (12.34), \begin_inset Quotes eld \end_inset scientific \begin_inset Quotes erd \end_inset (1.234e1), \begin_inset Quotes eld \end_inset compact \begin_inset Quotes erd \end_inset (a mix of these to produce a compact notation depending on thethe magnitude of the value; this is the default), or \begin_inset Quotes eld \end_inset hexact \begin_inset Quotes erd \end_inset (a specialized hexadecimal format used for exact round trips to ASCII format, rarely used for dispaly.) It only affects the output if the cell value is a floating point number. \end_layout \begin_layout Itemize Whether the cell is shadowed by its left neighbour. This means that the left neighbour cell additionally uses the room of the shadowed cell. \end_layout \begin_layout Itemize Whether the cell is ignored. \end_layout \begin_layout Itemize Whether the cell is locked, which prevents accidental edits or clearing of the cell. Note that block operations override this attribute, because when you deal with blocks, you usually know what you are doing. \end_layout \begin_layout Itemize Whether the cell is \begin_inset Quotes eld \end_inset transparent \begin_inset Quotes erd \end_inset or not, which means whether special characters for e.g. roff and \SpecialChar LaTeX should be quoted (default) or not. Not quoting them allows special effects (if you know roff or \SpecialChar LaTeX ), but is of course not portable. \end_layout \begin_layout Standard In addition, each column has a width. \end_layout \begin_layout Subsubsection Precision \end_layout \begin_layout Standard The precision only changes what is printed, teapot always uses the maximum precision for calculations. It also only affects the output if the cell value is a floating point number. Entering an empty precision means to set it to the default value. \end_layout \begin_layout Subsubsection Exponential / Decimal \end_layout \begin_layout Standard Forces exponential notation for numbers in a cell. Decimal mode will prefer plain decimal numbers unless the result is very big or very small. \end_layout \begin_layout Subsubsection Adjustment \end_layout \begin_layout Standard Cells contents can be aligned to the left, right or centered. By default, text is left adjusted and numbers are right adjusted. \end_layout \begin_layout Subsubsection Text attributes \end_layout \begin_layout Standard These attributes determine how the value of the cell should be displayed, in terms of characteristics of the displayed text. Currently, bold and underlined attributes are implemented, which may be applied independently. \end_layout \begin_layout Subsubsection Label \end_layout \begin_layout Standard This operation lets you edit the cell label of the current cell. Further it changes all occurences of it in the cell contents to the new value, unless you erased the cell label. If a block has been marked at the time you edit the cell label, all occurences of the label in contents of cells in that block will be changed. \end_layout \begin_layout Subsubsection Lock \end_layout \begin_layout Standard You can lock cells to protect them from accidental editing. Note that this protects you from modifying single cells. If you modify a block of cells which contains locked cells, those will be modified as well. This has been done because when using block commands, you usually know what you are doing. \end_layout \begin_layout Subsubsection Ignore \end_layout \begin_layout Standard Ignored cells will be completely ignored. They appear as empty cells on screen and during calculations. This is useful for temporarily disabling parts of your calculation, as the former content reappears when the ignore is removed again. \end_layout \begin_layout Subsubsection Transparent \end_layout \begin_layout Standard Usually, values are quoted as needed so that you get the exact same output as on screen. Transparent cells will be exported as-is into display-oriented file formats (\SpecialChar LaTeX , etc.) so that you can embed commands for subsequent processing in cell values. \end_layout \begin_layout Subsubsection Shadow \end_layout \begin_layout Standard Shadowed cells are effectively nonexistant. Instead, their left neighbour cell extends into the shadowed cell, so that longer text can be displayed. You may think of shadowing as a way to get multi-column cells. \end_layout \begin_layout Subsubsection Column Width \end_layout \begin_layout Standard The column width only affects the screen display, not the formatting of the final output (except formatted text files). It is intended to let you make better usage of the screen for more overview. If the width is too small to display the cell value, a placeholder will be displayed. \end_layout \begin_layout Subsection Block Functions \end_layout \begin_layout Subsubsection Copy/Move \end_layout \begin_layout Standard To copy a block of cells, mark it, then move the cell cursor to where the upper left corner of the copy should be and issue the copy command. Moving works similar, just use the move command. Of course you can mark three-dimensional blocks and copy them anywhere in the three-dimensional sheet, but doing so requires a good three-dimensional imagination to get what you want. \end_layout \begin_layout Subsubsection Fill \end_layout \begin_layout Standard To fill a block of cells, first mark a the block it should be filled with. This may be just one cell! Then move the cell cursor to where the upper left corner of the block to be filled should be and issue the fill command. You will be prompted for how often the marked block should be repeated in each dimension. For example, you may to repeat a cell 9 times below. Mark it, then move down one row. Issue the fill command and answer 1 to the number of column repetitions, 9 to rows and 1 to layers. \end_layout \begin_layout Subsubsection Fill With \end_layout \begin_layout Standard This works in the \begin_inset Quotes eld \end_inset opposite direction \begin_inset Quotes erd \end_inset from Fill, but is handy for when you just want to replicate a single cell but don't know the exact count of repetitions you want. To use this operation, first mark the block you want to fill. Then make the current cell be the (single) cell you want to use to fill that block. Then execute Fill With. \end_layout \begin_layout Subsubsection Clear \end_layout \begin_layout Standard Clearing means to delete the cell contents and set all attributes to the default value. If you want to preserve the attributes, just edit the contents of a cell and delete them. \end_layout \begin_layout Subsubsection Insert \end_layout \begin_layout Standard Since work sheets can be three-dimensional, you can insert cells in all three dimensions, too. The inserted cells will be empty and their attributes have the default values. Cells will always be moved away from the front upper left corner to make room for the inserted cells. If no block is marked, you will be asked if you really only want to insert a cell of if you want to insert a whole row, line or sheet. \end_layout \begin_layout Subsubsection Delete \end_layout \begin_layout Standard Deleting works contrary to inserting. The deleted cells will be filled by moving neighbour cells to their positions. You will be prompted for the direction from where those cells will be taken. Deleting an entire column column-wise is done by marking the column, use the delete command and chose X direction. \end_layout \begin_layout Subsubsection \begin_inset CommandInset label LatexCommand label name "subsec:Sort" \end_inset Sort \end_layout \begin_layout Standard Marked blocks of cells can be sorted after one or multiple keys, either column-wise, row-wise or depth-wise. Sorting a two dimensional block row-wise will sort lines, but if a three dimensional block is sorted row-wise, then horizontal layers will be sorted. The sort key is specified as vector which is orthogonal to the sorted elements, either in ascending or descending order. The following example illustrates the sort operation. The upper left part of the screen should look like this: \begin_inset Separator latexpar \end_inset \end_layout \begin_layout Standard \align center \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout one \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 2 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout two \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 2 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout three \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout four \end_layout \end_inset \end_inset \end_layout \begin_layout Standard The box shows you which block to mark. Now this block should be sorted row-wise, with the sort key being the numbers in descending order, i.e. we want the lines being numbered 4,3,2,1. Go to the block menu, then select sort. Use \family typewriter R)ow \family default , because that is how we want to sort this block. The X position of the sort key vector is 0, because the column 0 contains the numbers. The Z position is 0, too, because those numbers are on sheet 0. Now chose \family typewriter D)escending \family default as direction. At this point, you could add a secondary key or decide to sort the block by the keys entered so far. Use \family typewriter S)ort region \family default to sort it. That's it, the screen should look like this now: \begin_inset Separator latexpar \end_inset \end_layout \begin_layout Standard \align center \begin_inset Tabular \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 0 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 4 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout four \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout three \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 2 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 2 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout two \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 3 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout 1 \end_layout \end_inset \begin_inset Text \begin_layout Plain Layout one \end_layout \end_inset \end_inset \end_layout \begin_layout Subsubsection Mirror \end_layout \begin_layout Standard Mirroring a marked block of cells can be done in three directions: Left/right, upside/down and front/back. \end_layout \begin_layout Subsection Saving and Loading \end_layout \begin_layout Subsubsection File names \end_layout \begin_layout Standard Usually, you want to overwrite the loaded file. For this reason, the loaded file name is remembered. If the sheet doesn't have a file name, like after starting an empty sheet, you will be asked for a name when saving. \end_layout \begin_layout Standard Occasionally, you may want to rename a sheet, like before making critical changes or when you load an existing sheet to have a start for making a new one. The Save As operation allows you to save the file under a new name. \end_layout \begin_layout Subsubsection File Formats \end_layout \begin_layout Paragraph ASCII (.tpa) \end_layout \begin_layout Standard The ASCII file format allows easy generation/modification of saved sheets by shell scripts. Note that when reading a .tpa file, either ordinary decimal or scientific formats for floating point number are recognized, as well as the exact hex floating point format used by default when saving. The default extension is \family typewriter . \family default tpa. \end_layout \begin_layout Paragraph Legacy XDR (.tp) \end_layout \begin_layout Standard XDR (eXternal Data Representation) is a standard invented by Sun Microsystems which defines a canonical way of storing/transporting data on external media. Its advantage is that it is widely available and that it defines a portable floating point number format. The native teapot file format formerly used XDR so it is portable across different machine architectures and operating systems. The advantage of this over the portable ASCII format was that due to the (usually) missing conversion calculations any floating point constants will be saved/loaded exactly without conversion errors. It was discontinued because the ASCII format was made exact by virtue of the exact hexadecimal \begin_inset Quotes eld \end_inset %a \begin_inset Quotes erd \end_inset style ( \begin_inset Quotes eld \end_inset hexact \begin_inset Quotes erd \end_inset ) of representing floating point values, and so there was no need for a specialized binary format. Old .tp files may be read, but teapot no longer writes files in this format. \end_layout \begin_layout Paragraph CSV (.csv) \end_layout \begin_layout Standard CSV (comma seperated value) files only contain the data, not the expressions calculating it. Many spread sheets can generate this file format and many graphics programs like gnuplot(1) can read it. The field separator usually is a tab or comma, strings may be enclosed in double quotes and decimal numbers have a dot to mark the fractional part. One popular variation uses semicolons for separating fields and a decimal comma instead of a decimal point, which teapot tries to autodetect. \end_layout \begin_layout Standard On load, strings without quotes and with a \emph on 0x \emph default prefix followed by hexadecimal digits will be converted to integers. When loading CSV files, the sheet will not be cleared and the data will be load relative to the current cursor position. \end_layout \begin_layout Paragraph SC SpreadsheetCalculator (.sc) \end_layout \begin_layout Standard teapot can load simple SC sheets to convert them to teapot's native format. While loading, teapot converts all references to absolute cell positions to labels. This allows to insert and delete in such sheets without screwing the whole sheet up. teapot can not save sheets in SC format, because SC lacks many features. For now, only the most basic SC features are supported. \end_layout \begin_layout Paragraph Lotus 1-2-3 (.wk1) \end_layout \begin_layout Standard teapot can load simple WK1 sheets to convert them to teapot's native format. By default, 1-2-3 cell references are relative, so don't be surprised by a big amount of relative references in the resulting teapot sheet. For now, only the most basic 1-2-3 features are supported. \end_layout \begin_layout Paragraph Formatted ASCII (.txt) \end_layout \begin_layout Standard The generated formatted ASCII files contain about what you see on the screen. If your sheet has more than one layer, then the various layers will be saved separated by form feeds. \end_layout \begin_layout Paragraph Troff tbl (.tbl) \end_layout \begin_layout Standard teapot can generate tbl(1) table bodies in single files which are supposed to be used like this: \end_layout \begin_layout Quote \family typewriter .TS \begin_inset Newline newline \end_inset \family default \shape italic options \family typewriter \shape default ; \begin_inset Newline newline \end_inset .so \family default \shape italic filename \begin_inset Newline newline \end_inset \family typewriter \shape default .TE \end_layout \begin_layout Standard You will have to use soelim(1) to eliminate the \family typewriter .so \family default requests before the tbl run. The \shape italic options \family typewriter \shape default ; \family default are optional. If you use GNU roff, you will need to eliminate \family typewriter .lf \family default requests, because this GNU roff extension confuses GNU tbl: \end_layout \begin_layout Quote \family typewriter soelim \family default \shape italic file \shape default \family typewriter | grep -v '^ \backslash .lf' \end_layout \begin_layout Standard Alternatively, you can generate a stand-alone document, which needs no further operations to format and print. Note: If no block is marked, the whole sheet will be saved. \end_layout \begin_layout Paragraph \SpecialChar LaTeX (.latex) \end_layout \begin_layout Standard If you generate \SpecialChar LaTeX2e tables in single files, you include them in documents using the \family typewriter \backslash include \family default command. Alternatively, you can generate a stand-alone document, which needs no further operations to format and print. Note: If no block is marked, the whole sheet will be saved. \end_layout \begin_layout Paragraph Con\SpecialChar TeX t (.tex) \end_layout \begin_layout Standard Analogous to \SpecialChar LaTeX output, this generates input suitable to the Con\SpecialChar TeX t macro package. \end_layout \begin_layout Paragraph HTML (.html) \end_layout \begin_layout Standard You can generate html table bodies in single files which could be used in combination with server-side includes. This feature differs between the various servers, so refer to the manual for your web server for details, please. \end_layout \begin_layout Standard Alternatively, you can generate a stand-alone document. Note: If no block is marked, the whole sheet will be saved. \end_layout \begin_layout Subsection Other operations \end_layout \begin_layout Subsubsection Goto Location \end_layout \begin_layout Standard Sometimes, you directly want to go to a specific position, either to change its contents to see which cell a location expression refers to. This operation lets you enter an expression, which must evaluate to a value of the type location. If so, the cursor is positioned to that location. For example, you could enter \family typewriter &(10,2) \family default to go to cell 10,2 of the current layer or you could enter the name of a label you want to go to. Relative movements are no problem, either. \end_layout \begin_layout Subsubsection Shell \end_layout \begin_layout Standard Start a sub shell. Exiting from that sub shell will bring you back into teapot. This operation does not exist in the GUI version. \end_layout \begin_layout Subsubsection Version \end_layout \begin_layout Standard teapot will display its version number and copyright statement. \end_layout \begin_layout Subsubsection Help \end_layout \begin_layout Standard If teapot was built with the integrated help viewer, you can access this manual from within teapot itself. \end_layout \begin_layout Section Batch operations \end_layout \begin_layout Standard Besides interactive facilities, teapot has a batch mode. Using this batch mode, shell scripts can generate output from teapot sheets. This is handy if you use make(1) to generate a bigger document containing tables, because you don't have to generate a tbl or \SpecialChar LaTeX file each time you modify a sheet: make will do so. In batch mode, teapot reads batch commands from standard input. The following commands are available: \end_layout \begin_layout Description \family typewriter \series bold goto \family default \shape italic \begin_inset space ~ \end_inset location \series default \shape default Go to the specified \shape italic location \shape default . \end_layout \begin_layout Description \family typewriter \series bold from \family default \shape italic \begin_inset space ~ \end_inset location \series default \shape default Start marking a block. \end_layout \begin_layout Description \family typewriter \series bold to \family default \shape italic \begin_inset space ~ \end_inset location \series default \shape default End marking a block. \end_layout \begin_layout Description \family typewriter \series bold sort-x \family default \begin_inset space ~ \end_inset d|a \emph on \begin_inset space ~ \end_inset y \begin_inset space ~ \end_inset z \emph default \begin_inset space ~ \end_inset [ \begin_inset space ~ \end_inset d|a \emph on \begin_inset space ~ \end_inset y \begin_inset space ~ \end_inset z \emph default \begin_inset space ~ \end_inset ... \begin_inset space ~ \end_inset ] \end_layout \begin_layout Description \family typewriter \series bold sort- \family default y \begin_inset space ~ \end_inset d|a \emph on \begin_inset space ~ \end_inset x \begin_inset space ~ \end_inset z \emph default \begin_inset space ~ \end_inset [ \begin_inset space ~ \end_inset d|a \emph on \begin_inset space ~ \end_inset x \begin_inset space ~ \end_inset z \emph default \begin_inset space ~ \end_inset ... \begin_inset space ~ \end_inset ] \series default \end_layout \begin_layout Description \family typewriter \series bold sort- \family default z \begin_inset space ~ \end_inset d|a \emph on \begin_inset space ~ \end_inset x \begin_inset space ~ \end_inset \emph default y \begin_inset space ~ \end_inset [ \begin_inset space ~ \end_inset d|a \emph on \begin_inset space ~ \end_inset x \begin_inset space ~ \end_inset \emph default y \begin_inset space ~ \end_inset ... \begin_inset space ~ \end_inset ] \series default Sorts the marked block as described in section \begin_inset CommandInset ref LatexCommand vref reference "subsec:Sort" \end_inset , column-wise, row-wise or depth-wise, respectivly. "d" or "a" specify the sort order to be descending or ascending. \emph on x \emph default , \emph on y \emph default and \emph on z \emph default specify the position of the sort key \family typewriter relative \family default to the first cell of the marked block. Up to eight sort keys can be specified. This example reproduces the result from section \begin_inset CommandInset ref LatexCommand ref reference "subsec:Sort" \end_inset : \begin_inset Separator latexpar \end_inset \end_layout \begin_deeper \begin_layout Quote \family typewriter echo " \begin_inset Newline newline \end_inset from &(1,1,0) \begin_inset Newline newline \end_inset to &(2,4,0) \begin_inset Newline newline \end_inset sort-y d 0 0 \begin_inset Newline newline \end_inset save-csv result_num.txt \begin_inset Newline newline \end_inset " | teapot -b doc/unsorted \end_layout \end_deeper \begin_layout Description \family typewriter \series bold save-tbl \family default \emph on \begin_inset space ~ \end_inset file \series default \emph default \end_layout \begin_layout Description \family typewriter \series bold save-csv \family default \emph on \begin_inset space ~ \end_inset file \series default \emph default \end_layout \begin_layout Description \family typewriter \series bold save-latex \family default \emph on \begin_inset space ~ \end_inset file \series default \emph default \end_layout \begin_layout Description \family typewriter \series bold save-context \family default \emph on \begin_inset space ~ \end_inset file \series default \emph default \end_layout \begin_layout Description \family typewriter \series bold save-html \begin_inset space ~ \end_inset \family default \emph on file \series default \emph default Save the marked block in the specified format as \emph on file \emph default . \end_layout \begin_layout Description \family typewriter \series bold load-csv \begin_inset space ~ \end_inset \family default \emph on file \series default \emph default Load \emph on file \emph default in the specified format to the last \family typewriter goto \family default location. This has the same functionality as the interactive load described in subsection \emph on 5.12.4 \emph default . \end_layout \begin_layout Section Expressions \end_layout \begin_layout Standard Cells consist of a base (reset) expression, a clocked expression, and a current value. If the sheet is currently in the reset state (the default), all cells display their base value as current value. \end_layout \begin_layout Standard When the sheet is clocked (see Table \begin_inset CommandInset ref LatexCommand ref reference "tab:Key-Bindings-in" \end_inset ), the clocked expression is evaluated, using the current value of referenced cells. The new current value is the result of that evaluation. \end_layout \begin_layout Subsection Data Types \end_layout \begin_layout Standard In teapot, each value has an associated data type. The following data types exist: \end_layout \begin_layout Description Empty Empty cells have 0, 0.0 or \begin_inset Quotes eld \end_inset \begin_inset Quotes erd \end_inset as value, depending on context. \end_layout \begin_layout Description String A string is a sequence of characters enclosed by double quotes: \family typewriter "This is a string" \family default . A double quote can be part of the string, if it is quoted using a backslash: \family typewriter \begin_inset Quotes eld \end_inset \backslash \family default \begin_inset Quotes erd \end_inset \begin_inset Quotes erd \end_inset . If you want the backslash to appear in the output instead of quoting the next character, use it to quote itself: \family typewriter \begin_inset Quotes eld \end_inset \backslash \backslash \family default \begin_inset Quotes erd \end_inset . \end_layout \begin_layout Description Floating \begin_inset space ~ \end_inset Point Floating point values are inexact, their precision and range depends on the implementation of the C type double on your system. An example is: \family typewriter 42.0 \family default \end_layout \begin_layout Description Integer Integer values are exact, their range depends on the C type long on your system. An example is: \family typewriter 42 \end_layout \begin_layout Description Boolean \begin_inset Quotes eld \end_inset true \begin_inset Quotes erd \end_inset or \begin_inset Quotes eld \end_inset false, \begin_inset Quotes erd \end_inset used for logical conditions. \end_layout \begin_layout Description Location Cell labels and the result of the \family typewriter &() \family default function have this type, but there are no location constant literals. However, \family typewriter &(3,2,1), \family default for example, acts very much like a location constant literal. \end_layout \begin_layout Description Error Syntactical or semantical (type mismatch) errors cause this value, as well as division by 0 and the function \family typewriter error() \family default . An error always has an assigned error message. Functions and operators, when applied to a value of the type error, evaluate to just that value. That way, the first error which was found, possibly deep inside a complicated expression, will be shown. \end_layout \begin_layout Subsection Operators \end_layout \begin_layout Standard Unlike other spreadsheets, the operators in teapot check the type of the values they are applied to, which means trying to add a string to a floating point number will result in an type error. Operators on locations in the spreadsheet, which are just triples of integers, generally operate following typical rules for vectors, with particular notes below. The following operators are available, listed in ascending precedence: \end_layout \begin_layout Description x \series medium \emph on \begin_inset space ~ \end_inset \family typewriter \series default \emph default and \family default \series medium \emph on \begin_inset space ~ \end_inset \series default \emph default y evaluates to the logical conjunction of boolean values \emph on x \emph default and \emph on y \emph default . Note that this evaluation short-circuits: if \emph on x \emph default is false, then \emph on y \emph default is never evaluated, and so does not affect the value even if it is an error, for example. \end_layout \begin_layout Description x \series medium \emph on \begin_inset space ~ \end_inset \family typewriter \series default \emph default or \family default \series medium \emph on \begin_inset space ~ \end_inset \series default \emph default y evaluates to the logical disjunction of boolean values \emph on x \emph default and \emph on y \emph default . As with \family typewriter \series bold and \family default \series default , this evaluation short-circuits if \emph on x \emph default is true. \end_layout \begin_layout Description \series bold \emph on x \family typewriter \emph default < \family default \emph on y \series default \emph default evaluates to Boolean true if \emph on x \emph default is less than \emph on y \emph default . If \emph on x \emph default or \emph on y \emph default are empty, they are considered to be 0 if the other is an integer number, 0.0 if it is a floating point number and the empty string if it is a string. On locations, \emph on x= \family default \emph on y \series default \emph default evaluates to true if \emph on x \emph default is greater than or equal to \emph on y \emph default . For locations, this must hold for every component. \end_layout \begin_layout Description \series bold \emph on x \family typewriter \emph default > \family default \emph on y \series default \emph default evaluates to true if \emph on x \emph default is greater than \emph on y \emph default . As with <, for locations, every component must be greater than or equal, and at least one must be strictly greater. \end_layout \begin_layout Description \series bold \emph on x \family typewriter \emph default == \family default \emph on y \series default \emph default evaluates to true if \emph on x \emph default is equal to \emph on y \emph default . \end_layout \begin_layout Description \series bold \emph on x \family typewriter \emph default ~= \family default \emph on y \series default \emph default evaluates to true if the floating point value \emph on x \emph default is almost equal to the floating point value \emph on y \emph default . Almost equal means that the numbers are equal or neighbor each other in the floating point representation being used. It is an error to use this comparison with any type but float. \end_layout \begin_layout Description \series bold \emph on x \family typewriter \emph default != \family default \emph on y \series default \emph default evaluates to 1 if \emph on x \emph default is not equal to \emph on y \emph default . \end_layout \begin_layout Description Note: a string of consecutive relational operators is interpreted as the conjunction of each consecutive (overlapping) pair. Thus \family sans 2 <= y() <= 10 \family default will evaluate to true precisely in rows 2 through 10, inclusive (it is shorthand for \family sans 2 <= y() and y() <= 10 \family default ). Similarly \family sans @(cell1) == @(cell2) == @(cell3) \family default will return true exactly when all three cells have the same value. \end_layout \begin_layout Description \series bold \emph on x \family typewriter \emph default + \family default \emph on y \series default \emph default evaluates to the sum if \emph on x \emph default and \emph on y \emph default are numbers. If \emph on x \emph default and \emph on y \emph default are strings, the result is the concatenated string. If they are locations, this operates componentwise. \end_layout \begin_layout Description \series bold \emph on x \family typewriter \emph default - \family default \emph on y \series default \emph default evaluates to the difference if \emph on x \emph default and \emph on y \emph default are numbers. If they are locations, this operates componentwise. \end_layout \begin_layout Description \series bold \emph on x \family typewriter \emph default * \family default \emph on y \series default \emph default evaluates to the product if \emph on x \emph default and \emph on y \emph default are numbers. You can multiply a location by an integer, or take the dot product of the coordinates of two locations (although the use case for that is unclear). \end_layout \begin_layout Description \series bold \emph on x \family typewriter \emph default / \family default \emph on y \series default \emph default evaluates to the quotient if \emph on x \emph default and \emph on y \emph default are numbers. You can divide a location by an integer. \end_layout \begin_layout Description \series bold \emph on x \family typewriter \emph default % \family default \emph on y \series default \emph default evaluates to the remainder of the division if \emph on x \emph default and \emph on y \emph default are numbers. You can mod a location by an integer, or operate on two locations, in which case the mod operation applies componentwise. \end_layout \begin_layout Description \family typewriter \series bold - \family default \emph on x \series default \emph default evaluates to \family typewriter - \family default \emph on x \emph default if \emph on x \emph default is a number or location, or the negation of \emph on x \emph default if \emph on x \emph default is Boolean. If \emph on x \emph default is empty, the result will be empty, too. \end_layout \begin_layout Description \series bold \emph on x^y \series default \emph default evaluates to \emph on x \emph default to the power of \emph on y \emph default . \end_layout \begin_layout Description \family typewriter \series bold ( \family default \emph on expression \family typewriter \emph default ) \family default \series default evaluates to the expression. \end_layout \begin_layout Description \series bold \emph on function \family typewriter \emph default ( \family default \emph on argument \family typewriter \emph default , \family default ... \family typewriter ) \family default \series default evaluates to the value of the function applied to the values resulting from evaluating the argument expressions. Note that if no arguments are being supplied, the parentheses are optional. Hence, for example, you can use \begin_inset Quotes eld \end_inset e \begin_inset Quotes erd \end_inset by itself, like a reserved constant whose value is the usual mathematical \begin_inset Quotes eld \end_inset e, \begin_inset Quotes erd \end_inset the base of natural logarithms. \end_layout \begin_layout Subsection Functions \end_layout \begin_layout Standard This section documents all available functions in alphabetical order. The functions are described in a C-like notation; you don't have to write the types when you use the function in a formula. For example, use \family sans @(0,0,0) \family default , not \family sans @(int 0, int 0, int 0) \family default . If no type is given for the result of a function, it means the result type depends on the arguments. Brackets mark optional arguments. \end_layout \begin_layout Description @ \series medium ([location \emph on \begin_inset space ~ \end_inset l \emph default ,][int \begin_inset space ~ \end_inset \emph on x \emph default ][,[int \emph on \begin_inset space ~ \end_inset y \emph default ][,[int \emph on \begin_inset space ~ \end_inset z \emph default ]]]) \series default returns the value of the cell at the specified location. If any of \emph on x \emph default , \emph on y \emph default or \emph on z \emph default is specified, that value overrides the corresponding coordinate of the given location, which defaults to the location of the current cell if it is omitted. \end_layout \begin_layout Description \series medium location \begin_inset space ~ \end_inset \series default & \series medium ([location \emph on \begin_inset space ~ \end_inset l \emph default ,][int \emph on \begin_inset space ~ \end_inset x \emph default ][, \begin_inset space ~ \end_inset [int \emph on \begin_inset space ~ \end_inset y \emph default ][, \begin_inset space ~ \end_inset [int \emph on \begin_inset space ~ \end_inset z \emph default ]]]) \series default the arguments are interpreted in exactly the same way as for \series bold @ \series default (), but this fuction returns the location, not the value of the cell at that location. So note for example that a bare \series bold & \series default with no arguments (with or without parentheses) evaluates to the location of the current cell. \end_layout \begin_layout Description D( \series medium [location \emph on \begin_inset space ~ \end_inset l \emph default ,][int \begin_inset space ~ \end_inset \emph on x \emph default ][,[int \emph on \begin_inset space ~ \end_inset y \emph default ][,[int \emph on \begin_inset space ~ \end_inset z \emph default ]]] \series default ) Like \series bold & \series default (), except that any of \emph on x, y, \emph default or \emph on z \emph default specified are added to the given location, which defaults to the current location; and as a special case, if only the location is given, i.e. \family sans \series bold D \family default \series default ( \emph on l \emph default ), then the location \emph on l \emph default is added to the current location. Think \begin_inset Quotes eld \end_inset D \begin_inset Quotes erd \end_inset for \begin_inset Quotes eld \end_inset displaced (by). \begin_inset Quotes erd \end_inset Thus, both \family sans \series bold D \series default (-1) \family default and \family sans \series bold D \series default (left) \family default return the location of the cell immediately to the left of this one, and \family sans \series bold D \series default (,2,1) \family default returns the location of the cell two below this one on the following layer, as does \family sans \series bold D \family default \series default (&(0,2,1)), but \family sans \series bold D \family default \series default (TABLE,1) returns the location of the cell just to the right of the one labeled \begin_inset Quotes eld \end_inset TABLE \begin_inset Quotes erd \end_inset . \end_layout \begin_layout Description R( \series medium \emph on args \series default \emph default ) Shorthand for \series bold @ \series default ( \family sans \series bold D \family default \series default (args)). Think \begin_inset Quotes eld \end_inset R \begin_inset Quotes erd \end_inset for \begin_inset Quotes eld \end_inset relative. \begin_inset Quotes erd \end_inset Thus \family sans \series bold R \series default (-1) \family default returns the value of the cell immediately to the left of this one, and \family sans \series bold R \series default (,,1) \family default returns the same cell as this one but on the following layer, as do \family sans \series bold R \series default (&(0,0,1) \family default ) and \family sans \series bold R \series default (below \family default ), but \family sans \series bold R \family default \series default (TABLE,,1) returns the value of the cell immediately down from the one labeled \begin_inset Quotes eld \end_inset TABLE \begin_inset Quotes erd \end_inset . \end_layout \begin_layout Description X( \series medium label \emph on \begin_inset space ~ \end_inset to, \begin_inset space ~ \end_inset \emph default label \emph on \begin_inset space ~ \end_inset from, \begin_inset space ~ \end_inset \emph default [bool \emph on \begin_inset space ~ \end_inset fix_x \emph default ] \emph on , \begin_inset space ~ \end_inset \emph default [bool \emph on \begin_inset space ~ \end_inset fix_y \emph default ] \emph on , \begin_inset space ~ \end_inset \emph default [bool \emph on \begin_inset space ~ \end_inset fix_z \emph default ] \series default ) \begin_inset Quotes eld \end_inset Excel reference \begin_inset Quotes erd \end_inset : returns the value of the cell at a computed target location. This target location is the one reached from the current cell via the same offset as the cell with label \emph on to \emph default has from label \emph on from. \emph default The idea is that if you label the source of data you want to reference, say with \family sans SRC \family default , and the location of some place you want to start referring to it with \family sans REF \family default , then you can use \family sans \series bold X \series default (SRC,REF) \family default to refer to the source data, and fill this formula to neighboring cells to refer to the neighbors of the source, and it will all continue to work if either the source or the reference is moved around in the sheet. \begin_inset Newline newline \end_inset If the \emph on fix_DIM \emph default argument is present and positive, then the corresponding coordinate of the target cell is set to match that of \emph on to \emph default . This corresponds to fixing the row or column (or layer) of the reference, as with a \begin_inset Quotes eld \end_inset $ \begin_inset Quotes erd \end_inset character in Excel. Thus \family sans \series bold X \series default (SRC,REF,1,1,1) \family default is identical to \family sans @(SRC) \family default , but you should certainly prefer the latter for clarity of expression. \begin_inset Newline newline \end_inset There is a corresponding location function \family sans \series bold X& \series default () \family default as well, which takes exactly the same arguments with the same meanings, but it is rarely needed. It is provided for completeness. \begin_inset Newline newline \end_inset See the FAQ below for further discussion of cell references. \end_layout \begin_layout Description \series medium string \begin_inset space ~ \end_inset \series default $ \series medium (string \emph on \begin_inset space ~ \end_inset env \emph default ) \series default evaluates to the contents of the specified environment variable. If the variable does not exist, then an empty string will be returned. \end_layout \begin_layout Description above|below|left|right|up|down \series medium [([location \emph on \begin_inset space ~ \end_inset l \emph default ])] As bare words (without any arguments and also without the parentheses) these symbols return a one-cell displacement in the named direction, e.g. \family sans \series bold D \series default (above) \family default \series medium gives the location of the same cell as the current on but in the previous layer and \family sans \series bold R \series default (up) \family default \series medium yields the value of the cell one up from the current cell. With parentheses, they act like \series bold @ \series default () \series medium but displaced by one cell in the named direction, so \family sans \series default right() \family default \series medium returns the value of the cell immediately to the right of the current one, and \family sans \series default down(MYTABLE) \family default \series medium gives the value one line down from the cell labeled \family sans \series default MYTABLE \family default \series medium , etc. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default abs \series medium (float \emph on \begin_inset space ~ \end_inset x \emph default ) \series default \end_layout \begin_layout Description \series medium int \begin_inset space ~ \end_inset \series default abs \series medium (int \begin_inset space ~ \end_inset \emph on x \emph default ) \series default evaluates to the absolute value of \emph on x \emph default . \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default acos \series medium (float|int \emph on \begin_inset space ~ \end_inset x \emph default ) \series default evaluates to the arc cosine of \emph on x \emph default , where \emph on x \emph default is given in radians. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default arcosh \series medium (float|int \emph on \begin_inset space ~ \end_inset x \emph default ) \series default evaluates to the arc hyperbolic cosine of \emph on x \emph default , where \emph on x \emph default is given in radians. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default arsinh \series medium (float|int \emph on \begin_inset space ~ \end_inset x \emph default ) \series default evaluates to the arc hyperbolic sine of \emph on x \emph default , where \emph on x \emph default is given in radians. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default artanh \series medium (float|int \emph on \begin_inset space ~ \end_inset x \emph default ) \series default evaluates to the arc hyperbolic tangent of \emph on x \emph default , where \emph on x \emph default is given in radians. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default asin \series medium (float|int \emph on \begin_inset space ~ \end_inset x \emph default ) \series default evaluates to the arc sine of \emph on x \emph default , where \emph on x \emph default is given in radians. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default atan \series medium (float|int \emph on \begin_inset space ~ \end_inset x \emph default ) \series default evaluates to the arc tangent of \emph on x \emph default , where \emph on x \emph default is given in radians. \end_layout \begin_layout Description below \series medium [([location \emph on \begin_inset space ~ \end_inset l \emph default ])] displacement by one cell in the positive \series default \emph on z \emph default direction; see the fuller description at \family sans \series bold above \series default . \end_layout \begin_layout Description \series medium int \begin_inset space ~ \end_inset \series default bitand \series medium (int \emph on \begin_inset space ~ \end_inset v1, \begin_inset space ~ \end_inset ... \emph default ) evaluates to the bitwise \begin_inset Quotes eld \end_inset and \begin_inset Quotes erd \end_inset of all the supplied values. \end_layout \begin_layout Description \series medium int \begin_inset space ~ \end_inset \series default bitor \series medium (int \emph on \begin_inset space ~ \end_inset v \emph default 1, \emph on \begin_inset space ~ \end_inset \emph default ...) evaluates to the bitwise \begin_inset Quotes eld \end_inset or \begin_inset Quotes erd \end_inset of all the supplied values. \end_layout \begin_layout Description bool currently only acts as a keyword to \family sans \series bold is \series default (); \family default there are not currently any conversions to boolean type. Use e.g. \family sans \shape italic expr \shape default != 0 \family default to obtain a boolean value from a numerical expression. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default ceil \series medium (float \emph on \begin_inset space ~ \end_inset x \emph default ) evaluates to the smallest integral floating-point value greater than or equal to \family sans \series default \emph on x \emph default . \end_layout \begin_layout Description clock \series medium (integer \emph on \begin_inset space ~ \end_inset condition \emph default ,[location[,location]) \series default conditionally clocks the specified cell if the condition is not 0. If two locations are given, all cells in that range will be clocked. The return value of clock is empty. Note that the clocked expression of a cell can clock itself; indeed, that's the only way that a cell can be clocked more than once in a single recalculatio n. Take care with the \emph on condition \emph default expression to avoid recalculation becoming stuck in an infinite loop, however. \end_layout \begin_layout Description compact used as a keyword to the string() function; listed here to record that this identifier may not be used as a cell label. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default cos \series medium (float|int \emph on \begin_inset space ~ \end_inset x \emph default ) \series default evaluates to the cosine of \emph on x \emph default , where \emph on x \emph default is given in radians. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default cosh \series medium (float|int \emph on \begin_inset space ~ \end_inset x \emph default ) \series default evaluates to the hyperbolic cosine of \emph on x \emph default , where \emph on x \emph default is given in radians. \end_layout \begin_layout Description decimal used as a keyword to the string() function; listed here to record that this identifier may not be used as a cell label. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default deg2rad \series medium (float|int \emph on \begin_inset space ~ \end_inset x \emph default ) \series default evaluates to the degrees that are equivalent to \emph on x \emph default radians. \end_layout \begin_layout Description down \series medium [([location \emph on \begin_inset space ~ \end_inset l \emph default ])] displacement by one cell in the positive \series default \emph on y \emph default direction; see the fuller description at \family sans \series bold above \series default . \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default e \series medium [()] \series default evaluates to the Euler constant \emph on e \emph default . Note the parentheses are optional. \end_layout \begin_layout Description empty \series medium [( \shape italic args \shape default )] \series default ignores all of its arguments and returns the empty value. Without parentheses, acts as a keyword, typically for \family sans \series bold is \series default (). \end_layout \begin_layout Description \series medium error \begin_inset space ~ \end_inset \series default error \series medium [([ \emph on message \emph default ])] \series default converts its argument to a string just as with the string() function, and then returns an error with that string as the message. Without parentheses, acts as a keyword, e.g. for \family sans \series bold is \series default () \family default . \end_layout \begin_layout Description eval \series medium (location) \series default evaluates to the value of the expression in the cell at the given \emph on location \emph default , but evaluated in the context of the cell using eval(). This function may not be used nested any deeper than 32 times. \end_layout \begin_layout Description \series medium boolean \begin_inset space ~ \end_inset \series default false represents the false Boolean value. \end_layout \begin_layout Description fident a keyword indicating the token type of \begin_inset Quotes eld \end_inset function identifier, \begin_inset Quotes erd \end_inset provided for the sake of completeness. There is probably little practical call for this type. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default float \series medium [([float|string|int|empty \emph on \begin_inset space ~ \end_inset s \emph default ])] \series default converts into a floating point number the given float, string, int, or empty value (the latter converts to 0.0). If the argument is omitted, the value of the current cell is used. If the parentheses are omitted, acts as a keyword, e.g., for type testing with \family sans \series bold is \series default () \family default . \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default floor \series medium (float \emph on \begin_inset space ~ \end_inset x \emph default ) evaluates to the largest integral floating-point value less than or equal to \series default \emph on x \emph default . \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default frac \series medium (float \emph on \begin_inset space ~ \end_inset x \emph default ) \series default evaluates to the fractional part of \emph on x \emph default . \end_layout \begin_layout Description funcall a keyword indicating the \begin_inset Quotes eld \end_inset funcall \begin_inset Quotes erd \end_inset token type used to encode expressions as tokens; may be used with \family sans \series bold is \series default () \family default for example. \end_layout \begin_layout Description hexact used as a keyword to the string() function; listed here to record that this identifier may not be used as a cell label. \end_layout \begin_layout Description \series medium int \begin_inset space ~ \end_inset \series default int \series medium [([int|float|string|empty \emph on \begin_inset space ~ \end_inset x \emph default ][, \emph on \begin_inset space ~ \end_inset direction \emph default ])] \series default converts to an \emph on \emph default integer the given integer, float, string, or empty value \emph on x. \emph default (The latter converts to 0.) The optional second argument must be the name of one of the functions that produces a floating point integral value from a float, i.e., \family sans \series bold ceil \family default \series default , \family sans \series bold floor \family default \series default , \family sans \series bold round \family default \series default , or \family sans \series bold trunc \family default \series default , and it directs how to convert floating point values to an integer. (The default is \family sans \series bold trunc \family default \series default , see the documentation of the corresponding functions for a description of the conversion behavior.) If \emph on x \emph default is omitted, the value of the current cell is used. If in addition the parentheses are omitted, acts as a keyword, e.g., for value testing with \family sans \series bold is \series default () \family default . \end_layout \begin_layout Description is \series medium [([ \emph on x \emph default ][, \emph on \begin_inset space ~ \end_inset type1, \begin_inset space ~ \end_inset type2 \emph default ,...])] \series default Boolean-valued type testing. Returns true if the given value \emph on x \emph default is any of the listed types. Each type may be any of the keywords \family sans \series bold bool, empty, error, fident, float, funcall, int \family default \series default , \family sans \series bold lident, location, number, operator, \family default \series default or \family sans \series bold string \family default \series default . Each of these identifies a single type, except \family sans \series bold number \family default \series default , which is a shorthand for \family sans \series bold empty \family default \series default , \family sans \series bold float \family default \series default , \family sans \series bold int \family default \series default . If no types are specified, returns true for any non-empty value. (In other words, \family sans \series bold is \series default ( \emph on x \emph default ) \family default is a boolean-valued version of \family sans \series bold n \series default ( \emph on x \emph default ) \family default , without the special behavior when \emph on x \emph default is a location.) If \emph on x \emph default is omitted, defaults to the value of the current cell; the parentheses may be omitted as well, so bare \family sans \series bold is \family default \series default tests whether the current cell is non-empty. \end_layout \begin_layout Description left \series medium [([location \emph on \begin_inset space ~ \end_inset l \emph default ])] displacement by one cell in the negative \series default \emph on x \emph default direction; see the fuller description at \family sans \series bold above \series default . \end_layout \begin_layout Description \series medium string \begin_inset space ~ \end_inset \series default len \series medium (string \emph on \begin_inset space ~ \end_inset s \emph default ) \series default evaluates to the length of \emph on s \emph default . \end_layout \begin_layout Description lident a keyword indicating the \begin_inset Quotes eld \end_inset label identifier \begin_inset Quotes erd \end_inset token type. This type is not generally accessible, as labels always evaluate to their locations (or error if there is no such label). \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default log \series medium (float|int \emph on \begin_inset space ~ \end_inset x \emph default [, \begin_inset space ~ \end_inset float|int \emph on \begin_inset space ~ \end_inset y \emph default ]) \series default evaluates to the logarithm of \emph on x \emph default . If \emph on y \emph default is not specified, the result will be the natural logarithm, otherwise it will be the logarithm to the base of \emph on y \emph default . \end_layout \begin_layout Description location currently this is only a keyword, e.g., for use with \family sans \series bold is \series default () \family default . Use \family sans \series bold & \series default () \family default to convert three integers to a location. \end_layout \begin_layout Description \series medium location \begin_inset space ~ \end_inset \series default max \series medium (location \emph on \begin_inset space ~ \end_inset l1 \emph default , \begin_inset space ~ \end_inset location \emph on \begin_inset space ~ \end_inset l2 \emph default ) \emph on \begin_inset space ~ \end_inset \emph default | \emph on \begin_inset space ~ \end_inset \series default \emph default max \series medium ( \emph on v1 \emph default , \begin_inset space ~ \end_inset \emph on v2 \emph default , \emph on \begin_inset space ~ \end_inset \emph default ...) \series default evaluates to the maximum in the same way min does for the minimum. \end_layout \begin_layout Description \series medium location \begin_inset space ~ \end_inset \series default min \series medium (location \emph on \begin_inset space ~ \end_inset l1 \emph default , \begin_inset space ~ \end_inset location \emph on \begin_inset space ~ \end_inset l2 \emph default ) \emph on \begin_inset space ~ \end_inset \emph default | \emph on \begin_inset space ~ \end_inset \series default \emph default min \series medium ( \emph on v1 \emph default , \begin_inset space ~ \end_inset \emph on v2 \emph default , \emph on \begin_inset space ~ \end_inset \emph default ...) \series default The first form evaluates to the location of the minimum of all values in the block marked by the corners pointed to by \emph on l1 \emph default and \emph on l2 \emph default . Note that the empty cell is equal to 0, 0.0 and "", so if the first minimum is an empty cell, the result will be a pointer to this cell, too. If you are not interested in the location of the minimum but the value itself, use @(min( \emph on l1 \emph default , \emph on l2 \emph default )). The second form simply returns the smallest of the specified values, returning an error if it encounters two that are not comparable (like a string and an integer). \end_layout \begin_layout Description \series medium int \begin_inset space ~ \end_inset \series default n \series medium ([location \emph on \begin_inset space ~ \end_inset l1 \emph default [, \begin_inset space ~ \end_inset location \emph on \begin_inset space ~ \end_inset l2 \emph default ]) \emph on \begin_inset space ~ \end_inset \emph default | \emph on \begin_inset space ~ \end_inset \series default \emph default n \series medium ( \family roman \emph on v1, \family default \begin_inset space ~ \end_inset v2, \begin_inset space ~ \end_inset ... \emph default ) \series default The first form evaluates to the number of non-empty cells in the block with corners at location \emph on s l1 \emph default and \emph on l2 \emph default . Location \emph on l2 \emph default defaults to \emph on l1 \emph default ; i.e., with a single location argument \family sans \series bold n \family default \series medium ( \family sans \series default \emph on l1 \family default \series medium \emph default ) \series default just tests whether the cell at \emph on l1 \emph default is empty. Location \emph on l1 \emph default defaults to the current location. The second form simply returns the number of its arguments which are nonempty. \end_layout \begin_layout Description number \series medium [([bool|empty|int|float|string \emph on \begin_inset space ~ \end_inset x \emph default ])] \series default Converts its argument, which defaults to the value of the current cell, to the most appropriate number type. Thus, it leaves ints and floats alone, converts boolean values to integers 1 or 0, converts empty to integer 0, and converts numeric strings to ints if they don't have a decimal point and floats if they do. Without parentheses, acts as a keyword for \family sans \series bold is \series default () \family default , abbreviating the combination of float, int, and empty. \end_layout \begin_layout Description operator A keyword indicating the \begin_inset Quotes eld \end_inset operator \begin_inset Quotes erd \end_inset token type, representing symbols like parentheses, plus signs, commas, etc. \end_layout \begin_layout Description poly \series medium (float|integer \emph on \begin_inset space ~ \end_inset x \emph default , \begin_inset space ~ \end_inset float|integer \emph on \begin_inset space ~ \end_inset cn \emph default [, \begin_inset space ~ \end_inset ...]) \series default evaluates the polynomial \emph on \begin_inset Formula $c_{n}\cdot x^{n}+\ldots+c_{0}\cdot x^{0}$ \end_inset \emph default . \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default rad2deg \series medium (float|int \emph on \begin_inset space ~ \end_inset x \emph default ) \series default evaluates to the radians that are equivalent to \emph on x \emph default degrees. \end_layout \begin_layout Description right \series medium [([location \emph on \begin_inset space ~ \end_inset l \emph default ])] displacement by one cell in the positive \series default \emph on x \emph default direction; see the fuller description at \family sans \series bold above \series default . \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default rnd \series medium () \series default evaluates to a pseudo-random number between 0.0 and 1.0, changing each time the expression is evaluated. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default round \series medium (float \emph on \begin_inset space ~ \end_inset x \emph default ) evaluates to the argument \series default \emph on x \emph default rounded to an integral value. Unless the system floating-point rounding direction has been changed, this will be the integral value nearest to \emph on x \emph default . \end_layout \begin_layout Description scientific Used as a keyword argument to the string() function; listed here to record that this identifier may not be used as a cell label. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default sin \series medium (float|int \emph on \begin_inset space ~ \end_inset x \emph default ) \series default evaluates to the sine of \emph on x \emph default , where \emph on x \emph default is given in radians. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default sinh \series medium (float|int \emph on \begin_inset space ~ \end_inset x \emph default ) \series default evaluates to the hyperbolic sine of \emph on x \emph default , where \emph on x \emph default is given in radians. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default sqrt \series medium (float|int \emph on \begin_inset space ~ \end_inset x \emph default ) \series default evaluates to the square root of \emph on x \emph default . \end_layout \begin_layout Description \series medium string \begin_inset space ~ \end_inset \series default strftime \series medium (string \emph on \begin_inset space ~ \end_inset f \emph default \begin_inset space ~ \end_inset [, \begin_inset space ~ \end_inset integer \emph on \begin_inset space ~ \end_inset t \emph default ]) \series default evaluates to the time \emph on t \emph default formatted according to the format specified in \emph on f \emph default . Times in \emph on t \emph default are counted in seconds since epoch (1970-1-1 0:00). If \emph on t \emph default is empty or 0, the actual time is used. For the format specifications consult the man page of your c library, strftime (3). Example: \emph on @(now)=int(strftime("%s")) \emph default sets the field with label now to the actual time. \end_layout \begin_layout Description \series medium string \begin_inset space ~ \end_inset \series default string \series medium ( \emph on x \emph default [, \begin_inset space ~ \end_inset [integer \emph on \begin_inset space ~ \end_inset precision \emph default ][, \begin_inset space ~ \end_inset \emph on format \emph default ]]) \series default evaluates to the string representation of its first argument. The optional second argument gives the precision used for converting floating point numbers to string form. The optional third argument may be one of the keywords \begin_inset Quotes eld \end_inset decimal \begin_inset Quotes erd \end_inset , \begin_inset Quotes eld \end_inset scientific \begin_inset Quotes erd \end_inset , \begin_inset Quotes eld \end_inset compact \begin_inset Quotes erd \end_inset , or \begin_inset Quotes eld \end_inset hexact \begin_inset Quotes erd \end_inset , controlling the format for converting floating point numbers to string form. If the optional arguments are not specified, current defaults are used. \end_layout \begin_layout Description \series medium int \begin_inset space ~ \end_inset \series default strptime \series medium (string \emph on \begin_inset space ~ \end_inset f \emph default , \begin_inset space ~ \end_inset string \emph on \begin_inset space ~ \end_inset datetime \emph default ) \series default evaluates to the seconds since epoch (1970-1-1 0:00) of the \emph on datetime \emph default string, parsed according to the format specified in \emph on f \emph default . For the format specifications consult the man page of your c library, strptime (3). \end_layout \begin_layout Description \series medium string \begin_inset space ~ \end_inset \series default substr \series medium (string \emph on \begin_inset space ~ \end_inset s, \begin_inset space ~ \end_inset \emph default integer \emph on \begin_inset space ~ \end_inset x \begin_inset space ~ \end_inset \emph default [,integer \emph on \begin_inset space ~ \end_inset y \emph default ]) \series default evaluates to the substring of \emph on s \emph default between \emph on x \emph default and \emph on y \emph default , which start at 0. If is omitted, the substring proceeds to the end of the string. \end_layout \begin_layout Description sum \series medium (location \emph on \begin_inset space ~ \end_inset l1 \emph default , \begin_inset space ~ \end_inset location \emph on \begin_inset space ~ \end_inset l2 \emph default ) \emph on \begin_inset space ~ \end_inset \emph default | \emph on \begin_inset space ~ \end_inset \series default \emph default sum \series medium ( \family roman \emph on v1, \family default \begin_inset space ~ \end_inset \family roman v2, \family default \begin_inset space ~ \end_inset \family roman ... \emph default ) \family default \series default The first form evaluates to the sum of all values in the block with corners at locations \emph on l1 \emph default and \emph on l2 \emph default . The second form simply adds all of its arguments. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default tan \series medium (float|int \emph on \begin_inset space ~ \end_inset x \emph default ) \series default evaluates to the tangent of \emph on x \emph default , where \emph on x \emph default is given in radians. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default tanh \series medium (float|int \emph on \begin_inset space ~ \end_inset x \emph default ) \series default evaluates to the hyperbolic tangent of \emph on x \emph default , where \emph on x \emph default is given in radians. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default tau \series medium [()] \series default evaluates to the circle constant \begin_inset Formula $\tau$ \end_inset , the ratio of circumference to radius of any circle. (Note \begin_inset Formula $\tau=2\pi$ \end_inset .) \end_layout \begin_layout Description \series medium int \begin_inset space ~ \end_inset \series default time \series medium [()] \begin_inset ERT status open \begin_layout Plain Layout \end_layout \end_inset \series default each time this expression is evaluated, it gives the time in seconds since the epoch. \end_layout \begin_layout Description \series medium boolean \begin_inset space ~ \end_inset \series default true represents the true Boolean value. \end_layout \begin_layout Description \series medium float \begin_inset space ~ \end_inset \series default trunc \series medium (float \emph on \begin_inset space ~ \end_inset x \emph default ) evaluates to the integer part of \series default \emph on x \emph default in floating-point form; generally this should be the same as \emph on x - \emph default frac( \emph on x \emph default ). \end_layout \begin_layout Description up \series medium [([location \emph on \begin_inset space ~ \end_inset l \emph default ])] displacement by one cell in the negative \series default \emph on y \end_layout \begin_layout Description \series medium int \begin_inset space ~ \end_inset \series default x \series medium ([location \emph on \begin_inset space ~ \end_inset l \emph default ]) \series default \end_layout \begin_layout Description \series medium int \begin_inset space ~ \end_inset \series default y \series medium ([location \emph on \begin_inset space ~ \end_inset l \emph default ]) \series default \end_layout \begin_layout Description \series medium int \begin_inset space ~ \end_inset \series default z \series medium ([location \emph on \begin_inset space ~ \end_inset l \emph default ]) \series default evaluate to the \emph on x \emph default , \emph on y \emph default and \emph on z \emph default position of the given location, of the currently updated cell if none is given. These functions are usually used in combination with the @ function for obtaining information from other cells, but see also the convenience functions \family sans \series bold R \series default () \family default and \family sans \series bold D \series default () \family default for relative references. \end_layout \begin_layout Subsection Expression Grammar \end_layout \begin_layout Description digit::= \family typewriter 0 \family default | .. | \family typewriter 9 \end_layout \begin_layout Description hex_digit::= \family typewriter 0 \family default | .. | \family typewriter 9 \family default | \family typewriter a \family default | .. | \family typewriter f \end_layout \begin_layout Description octal_digit::= \family typewriter 0 \family default | .. | \family typewriter 7 \end_layout \begin_layout Description decimal_integer::= \emph on digit \emph default { \emph on digit \emph default } \end_layout \begin_layout Description hex_integer::= \family typewriter 0x \family default \emph on hex_digit \emph default { \emph on hexdigit \emph default } \end_layout \begin_layout Description octal_integer::= \family typewriter 0 \family default \emph on octal_digit \emph default { \emph on octdigit \emph default } \end_layout \begin_layout Description integer::= \emph on decimal_integer \emph default | \emph on hex_integer \emph default | \emph on octal_integer \end_layout \begin_layout Description float::= \emph on digit \emph default { \emph on digit \emph default } [ \family typewriter . \family default ] { \emph on digit \emph default } [ \family typewriter e \family default | \family typewriter E \family default [ \family typewriter + \family default | \family typewriter - \family default ] \emph on digit \emph default { \emph on digit \emph default } ] \end_layout \begin_layout Description quoted_character::= \emph on \backslash any_character \end_layout \begin_layout Description character::= \emph on any_character \emph default | \emph on quoted_character \end_layout \begin_layout Description string::= \family typewriter " \family default { \emph on character \emph default } \family typewriter " \end_layout \begin_layout Description identifier_character::= \family typewriter _ \family default | \family typewriter @ \family default | \family typewriter & \family default | \family typewriter . \family default | \family typewriter $ \family default | \emph on alpha_character \end_layout \begin_layout Description identifier::= \emph on identifier_character \emph default { \emph on identifier_character \emph default | \emph on digit \emph default } \end_layout \begin_layout Description function::= \emph on identifier \emph default [ \family typewriter ( \family default [ \emph on term \emph default ] { \family typewriter , \family default [ \emph on term \emph default ] } \family typewriter ) \family default ] \end_layout \begin_layout Description label::= \emph on identifier \end_layout \begin_layout Description parenterm::= \family typewriter ( \family default \emph on term \emph default \family typewriter ) \end_layout \begin_layout Description negterm::= \family typewriter - \family default \emph on primary \end_layout \begin_layout Description primary::= \emph on function \emph default | \emph on label \emph default | \emph on parenterm \emph default | \emph on negterm \end_layout \begin_layout Description powterm::= [ \family typewriter - \family default ] \emph on primary \emph default { \family typewriter ‸ \family default \emph on primary \emph default } \end_layout \begin_layout Description mathterm::= \emph on powterm \emph default { \family typewriter / \family default | \family typewriter * \family default | \family typewriter % \family default \emph on powterm \emph default } \end_layout \begin_layout Description factor::= \emph on mathterm \emph default { \family typewriter + \family default | \family typewriter - \family default \emph on mathterm \emph default } \end_layout \begin_layout Description relterm::= \emph on factor \emph default { \family typewriter < \family default | \family typewriter <= \family default | \family typewriter >= \family default | \family typewriter > \family default | \family typewriter == \family default | \family typewriter != \family default \emph on factor \emph default } \end_layout \begin_layout Description conjterm::= \emph on relterm \family sans \emph default { \family typewriter and \family sans \family default \emph on relterm \family sans \emph default } \end_layout \begin_layout Description term::= \emph on conjterm \family sans \emph default { \family typewriter or \family sans \family default \emph on conjterm \family sans \emph default } \end_layout \begin_layout Subsection Implementation notes \end_layout \begin_layout Standard Note that the implementation of a function can tell the difference between whether it is called with parentheses and no arguments, like \begin_inset Quotes eld \end_inset func() \begin_inset Quotes erd \end_inset , or called without parentheses at all, like \begin_inset Quotes eld \end_inset func \begin_inset Quotes erd \end_inset – in the former case it receives an argument count of 0, and in the latter an argument count of -1. So the same symbol can have different semantics depending on which way it is called. In most cases such a difference is counterintuitive, but it seems to work fairly well for the directional \begin_inset Quotes eld \end_inset constants, \begin_inset Quotes erd \end_inset i.e. bare \begin_inset Quotes eld \end_inset left \begin_inset Quotes erd \end_inset is the displacement &(-1,0,0), whereas left() is the location one to the left. The no-parentheses form is also useful for constants like \begin_inset Quotes eld \end_inset e \begin_inset Quotes erd \end_inset and \begin_inset Quotes eld \end_inset tau \begin_inset Quotes erd \end_inset , and it is also used, for example, to allow the names of the functions \begin_inset Quotes eld \end_inset floor \begin_inset Quotes erd \end_inset , \begin_inset Quotes eld \end_inset round \begin_inset Quotes erd \end_inset , etc. to be used as keywords for the int() function. \end_layout \begin_layout Standard Note also that some functions are actually implemented as \emph on macros \emph default , which are just like functions but receive their arguments unevaluated. The difference is meant to be transparent to usage of the function, so it is not mentioned elsewhere in this documentation. However, the macro facility is necessary when the function would need to control the evaluation of the arguments, as in the short-circuiting logical operations, or takes an expression as an argument, say to evaluate it on other cells. \end_layout \begin_layout Section Frequently Asked Questions \end_layout \begin_layout Subsection Why is 1.0 unequal 1.0? \end_layout \begin_layout Standard If your machine uses binary floating point arithmetic, and chances are that it does, you may eventually find yourself in the following situation: \end_layout \begin_layout Quote 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1 \end_layout \begin_layout Standard You expect to see 1.0 as result, and indeed that is what you get. Now you compare this result to the constant 1.0, but surprisingly for many users, the result is 0. Appearantly, 1.0 is unequal 1.0 for teapot. \end_layout \begin_layout Standard This is not a bug in teapot, in fact it is not a bug at all. The problem is, that 0.1 (1.0/10.0) does not have an exact representation in binary floating point arithmetic, similar to how 1.0/3.0 does not have an exact representation in decimal arithmetic (or binary, for that matter). As such, a value very close to 0.1 is used, but when displaying it, it will be rounded to 0.1. The result is obvious, adding this number which is a little different from 0.1 ten times leads to a result very close to but not quite 1.0. Since it is so close, displaying it rounded to only a few digits precision shows 1.0. \end_layout \begin_layout Standard To solve the comparison problem, teapot has the operator \family typewriter ~= \family default (in contrast to the operator ==), which compares two floating point values apart from the last significant bit. Use this operator to compare the two values from above and the result will be 1, meaning they are about equal. Don't assume that a number which can be expressed with a finite number of decimal digits will be represented exactly in binary floating point arithmetic. \end_layout \begin_layout Subsection How do I hide intermediate results? \end_layout \begin_layout Standard If you used flat, two-dimensional spread sheets before, you are probably used to hidden cells which contain intermediate results, global constants, scratch areas and the like. teapot has no way to hide cells, but you have three dimensions. Just use one or more layers for such cells and give each cell a label in order to reference and find it easily. \end_layout \begin_layout Subsection Why is there no conditional evaluation? \end_layout \begin_layout Standard There is no special operator or function for conditional evaluation. I could add one easily, but then next someone would ask for loops and someone else for user-defined functions, variables and so on. If you need a programming language, you know where to find it. \end_layout \begin_layout Standard But don't worry. The answer is, that conditional evaluation comes for free with teapot's orthogonal cell addressing. As an example, depending on the cell labelled \family typewriter X \family default being negative or not, you want the result to be the string \family typewriter "BAD \family default or \family typewriter "GOOD" \family default . This is the solution: \end_layout \begin_layout Quote eval(BAD + &((@(X)>=0),0,0)) \end_layout \begin_layout Standard Note this is making use of the fact that you can add locations in the natural way. The cell labelled \family typewriter BAD \family default contains the string \family typewriter "BAD" \family default , its right neighbour contains the string \family typewriter "GOOD" \family default . If you have nested conditions, you could weight them with 1, 2, 4 and so on to address a bigger range of cells. Alternatively, you could make use of all three dimensions for nested conditions. \end_layout \begin_layout Subsection But my references don't do the right thing when I move or copy them! \end_layout \begin_layout Standard If you are used to other spreadsheets, you have probably noticed that references like \family sans @(0,1,0) \family default (for the start of the second row) or \family sans @(MYDATA) \family default (for a location) are \begin_inset Quotes eld \end_inset absolute \begin_inset Quotes erd \end_inset – they always refer to the same location no matter where in the spreadsheet they occur. And of course sometimes it is convenient, for example when making a column of consecutive numbers, to refer to nearby cells in a relative manner, either with say \family sans @(x(),y()-1,z())+1 \family default or \family sans @(&()+&(0,-1,0))+1 \family default or just \family sans R(,-1)+1 \family default to add one to the value of the cell just above. Then you can fill that expression down and get your column of consecutive numbers. \end_layout \begin_layout Standard But these sorts of relative expressions only keep working if the cells move together with the cells they refer to. If for example you have a row of cells that are all referring to the row above with a relative reference (like \family sans R(,-1) \family default ) and you insert another row in between them, your references will be all messed up. There is value to \begin_inset Quotes eld \end_inset Excel-style \begin_inset Quotes erd \end_inset references that can be used to fill and which also can move around while still just \begin_inset Quotes eld \end_inset referring to what you want. \begin_inset Quotes erd \end_inset \end_layout \begin_layout Standard To provide for this need, teapot has a function \family sans \series bold X \series default (SRC, REF) \family default to retrieve the value of the cell labeled \family sans SRC \family default \bar under from \bar default the cell labeled \family sans REF \family default . If the so-labeled cells move around (either the source or the reference) it will still work. This is not particularly useful in and of itself; what makes it useful is that from a cell other than \family sans REF \family default , it gives you the value of the cell that stands in the same relation to \family sans SRC \family default as that cell stands to \family sans REF \family default . So in the cell to the right of \family sans REF \family default , it will give you the value of the cell to the right of \family sans SRC \family default ; in the cell below, it gives you the cell below \family sans SRC \family default , etc. Now you can fill a block of cells around \family sans REF \family default with formulas contaning \family sans X(SRC,REF) \family default and they will refer to the analogous block of cells around \family sans SRC \family default . \end_layout \begin_layout Standard Sometimes you want to make this kind of reference and fix one of the coordinates but not the others; \family sans X() \family default has optional flags for this, as well, so that \family sans X(SRC,REF,,,1) \family default will always be on the same layer as \family sans SRC \family default regardless of what layer it is called from or what layer \family sans REF \family default is on. Thus \family sans X(SRC,REF,1,1,1) \family default is just \family sans @(SRC) \family default , but the intent of the latter is much clearer. \end_layout \begin_layout Standard You might ask as a follow-up question: Isnt \family sans X(SRC, REF) \family default much more cumbersome than just referring to cells by coordinate and then letting Excel just do the right thing as you copy and move either that formula or the referred-to data? The response to this is that in a typical spreadsheet, there are only a small number of fundamental references, and all other references derive from them in this way. So you generally only need a few labels, and by taking just a little extra time to apply those labels and refer to them in initial formulas, you are making the semantics of your references much clearer and in essence documenting them within your spreadsheet. This extra effort will therefore be repaid in an easier-to-use, easier-to-under stand, and easier-to-maintain and update spreadsheet. \end_layout \end_body \end_document