From 519048d664b3cffd5420bb89b5aa162cbde5373c Mon Sep 17 00:00:00 2001 From: "G. Branden Robinson" Date: Tue, 8 Oct 2024 02:21:22 -0500 Subject: [PATCH 01/15] src/utp.mac: Use more portable `\s` syntax Fixes problem with chapter headings being set in 1-point type. groff 1.23.0 NEWS: * Type size escape sequences of the form "\sNN", where NN is in the range 10-39, are now recognized only in compatibility mode ("groff -C"); when encountered, an error diagnostic is emitted. Otherwise, "\sN" is interpreted as setting the type size to the single-digit value N (in scaled points), which ends the escape sequence. This change eliminates a quirk in the language grammar that dates back to the mid-1970s (AT&T troff by Ossanna) but was not documented in the Troff User's Manual until 1992 when Kernighan updated CSTR #54 for device-independent AT&T troff. The form "\s(NN" is accepted for two-digit sizes in all known troffs. The form "\s[NNN]" accepts a numeric expression of variable length; it has been supported by groff since version 1.01 (March 1991) or earlier, by Heirloom Doctools troff since its 2005-08-16 release, and by neatroff, but not by Plan 9 troff. The form "\s'NNN'" is also widely supported. [...] --- src/utp.mac | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utp.mac b/src/utp.mac index 889d924..ab40da9 100644 --- a/src/utp.mac +++ b/src/utp.mac @@ -255,12 +255,12 @@ Version of 16 November 2002 .\} .el .ds chapter_type Chapter .\" If there is a section number, output Type and section number -.if !'\\$1'' \s14\fB\\*[chapter_type] \\$1\fP\s0 +.if !'\\$1'' \s(14\fB\\*[chapter_type] \\$1\fP\s0 .\" If there is no section number, but there is a type, then ouput it -.if '\\$1'' .if !'\\$3'' \s14\fB\\*[chapter_type]\fP\s0 +.if '\\$1'' .if !'\\$3'' \s(14\fB\\*[chapter_type]\fP\s0 .sp 5p .\" Print the section title if there is one -\#.if !'\\$2'' \s14\fB\\$2\fP\s0 +\#.if !'\\$2'' \s(14\fB\\$2\fP\s0 .if !'\\$2'' \{\ .ps 14 .B From 5a5fa35f4fb914a3ef900ea9ed7bfa4976ef384d Mon Sep 17 00:00:00 2001 From: "G. Branden Robinson" Date: Tue, 8 Oct 2024 02:17:09 -0500 Subject: [PATCH 02/15] src/utp.mac: Use groff, not AT&T troff, font names Fixes numerous (1,000+) warnings of the following form: troff:./utp_ix.t:4034: warning: cannot select font 'CW' --- src/utp.mac | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/utp.mac b/src/utp.mac index ab40da9..b566fd8 100644 --- a/src/utp.mac +++ b/src/utp.mac @@ -10,6 +10,9 @@ book available again. Version of 16 November 2002 .. +.ftr C CR +.ftr CW CR +.ftr H HR .RT .nr nH 0 \" don't number [ABCD]-heads .nr gE 0 \" don't add chapter number to [ABCD]-heads From de08a0d4c9f9adbbfba4d04af99b95879f414ccb Mon Sep 17 00:00:00 2001 From: "G. Branden Robinson" Date: Tue, 8 Oct 2024 02:39:21 -0500 Subject: [PATCH 03/15] src/ch12.t: Fix warnings from groff ms macros ...and annotate apparently incorrect claims in document. This prompts new diagnostics, this time from the formatter, but I'm breaking this up to illuminate matters. Fixes: s.tmac:./ch12.t:3165: warning: excess arguments to .BX ignored s.tmac:./ch12.t:3168: warning: excess arguments to .BX ignored s.tmac:./ch12.t:3171: warning: excess arguments to .BX ignored s.tmac:./ch12.t:3174: warning: excess arguments to .BX ignored --- src/ch12.t | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/ch12.t b/src/ch12.t index c83f599..7c9e502 100644 --- a/src/ch12.t +++ b/src/ch12.t @@ -3162,16 +3162,16 @@ selections a user would select to reach a given command. For example: .LP .in 5n -.BX "\s-2M\s0"\c +.BX \s-2M\s0\c ain menu .in +5n -.BX "\s-2P\s0"\c +.BX \s-2P\s0\c ortfolio commands .in +5n -.BX "\s-2E\s0"\c +.BX \s-2E\s0\c valuate portfolios .in +5n -.BX "\s-2S\s0"\c +.BX \s-2S\s0\c hock factors .in 0 .PP @@ -3211,6 +3211,12 @@ aside: The .CW \ec escape sequence brings text from the following line onto the current line. +.\" XXX: Not _exactly_. No forward scanning is performed. When +.\" filling, `\c` instructs the formatter to suppress the word space +.\" that an input line break normally places on the output. When not +.\" filling, it suppresses the _line_ break and input line break +.\" the formatter normally places on the output. +.\" --GBR, 2024-10-08 You would use this, for example, when you don't want the argument to a macro to be separated from the first word on the next line by the space @@ -3219,7 +3225,18 @@ The fact that the .CW .BX macro already makes provision for this case, and allows you to supply continued text in a second optional -argument, is somewhat irrelevant to this example. +argument, +.\" XXX: Eh? What version of ms did this? Just considering formatters +.\" extant circa 1987 when UTP was written, V6 Unix didn't. V7 Unix +.\" didn't. 4.2BSD didn't. 4.3BSD didn't. DWB 3.3 (which was later, +.\" 1993 or so, but is all we have) didn't. +.\" --GBR, 2024-10-08 +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=V6/usr/lib/tmac.s +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/lib/tmac/tmac.s +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=4.2BSD/usr/lib/tmac/tmac.s +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD/usr/lib/tmac/tmac.s +.\" https://github.com/n-t-roff/DWB3.3/blob/master/macros/ms/tmac.s.sr +is somewhat irrelevant to this example. The files had been coded as shown here, the mistake had been made, and there were hundreds, perhaps thousands, of instances to correct). From 4373c835a5fd1c86449a5bb41abae31d0da121cb Mon Sep 17 00:00:00 2001 From: "G. Branden Robinson" Date: Tue, 8 Oct 2024 02:42:44 -0500 Subject: [PATCH 04/15] src/ch12.t: Drop use of `\c` with `BX` macro Fixes: troff:./ch12.t:3165: error: an escaped 'c' is not allowed in a zero-width output escape sequence argument troff:./ch12.t:3168: error: an escaped 'c' is not allowed in a zero-width output escape sequence argument troff:./ch12.t:3171: error: an escaped 'c' is not allowed in a zero-width output escape sequence argument troff:./ch12.t:3174: error: an escaped 'c' is not allowed in a zero-width output escape sequence argument --- src/ch12.t | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ch12.t b/src/ch12.t index 7c9e502..2f01db9 100644 --- a/src/ch12.t +++ b/src/ch12.t @@ -3162,16 +3162,16 @@ selections a user would select to reach a given command. For example: .LP .in 5n -.BX \s-2M\s0\c +.BX \s-2M\s0 ain menu .in +5n -.BX \s-2P\s0\c +.BX \s-2P\s0 ortfolio commands .in +5n -.BX \s-2E\s0\c +.BX \s-2E\s0 valuate portfolios .in +5n -.BX \s-2S\s0\c +.BX \s-2S\s0 hock factors .in 0 .PP From 2d71e7bdd5ba36147f6dca1801f73e82c9bf28ff Mon Sep 17 00:00:00 2001 From: "G. Branden Robinson" Date: Tue, 8 Oct 2024 02:47:01 -0500 Subject: [PATCH 05/15] src/ch15.t: Improve table format The text blocks set wider than the author(s) expected. Let their column expand instead of presuming an explicit width. Fixes: ./ch15.t:1932: warning: table wider than line length minus indentation --- src/ch15.t | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch15.t b/src/ch15.t index 1966e61..f93f1f8 100644 --- a/src/ch15.t +++ b/src/ch15.t @@ -1927,7 +1927,7 @@ drawing command as if it were a separate word. .page 459 .RS .TS -lf(CW) lw(4.5i). +lf(CW) lx. T{ \\v'-.25i'\\c T} T{ From a78d73260e398bbf2420882a67512cd2dc2af5b2 Mon Sep 17 00:00:00 2001 From: "G. Branden Robinson" Date: Tue, 8 Oct 2024 02:52:54 -0500 Subject: [PATCH 06/15] src/ch15.t: Use valid delimiter in `\b` escape seq Fixes: troff:./ch15.t:2728: error: character ':' is not allowed as a delimiter ...and indeed it is not. ':' is a valid operator in a numeric expression (it's a Boolean "or" operator), and those are not permitted to be delimiters in escape sequences parameterized thus (as we see with the bracket-building escape sequence here). --- src/ch15.t | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ch15.t b/src/ch15.t index f93f1f8..42cfa14 100644 --- a/src/ch15.t +++ b/src/ch15.t @@ -386,8 +386,8 @@ Table \\$1: \\$2 . \" left or right margin depending on whether if falls on . \" an odd or even page, if you change something prior to . \" calling this, it might shift sides on you. -.if e .tl '\b:\\$1:''' -.if o .tl '''\b:\\$1:' +.if e .tl '\b@\\$1@''' +.if o .tl '''\b@\\$1@' .lt -.5i .po +.25i .cs B From 4f4e8d18d3d21905d25c23450c2999991f31afda Mon Sep 17 00:00:00 2001 From: "G. Branden Robinson" Date: Tue, 8 Oct 2024 03:34:16 -0500 Subject: [PATCH 07/15] src/appa.t: Use `x` tbl column modifier ...instead of `expand` region option. Fixes: ./appa.t:529: warning: table column separation reduced to fit line length --- src/appa.t | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/appa.t b/src/appa.t index 876dd7f..de7e217 100644 --- a/src/appa.t +++ b/src/appa.t @@ -522,10 +522,10 @@ command. .\" larger, for readability and to match the paper UTP. .\" /Andreas 2002-10-21 .TS -tab(#), expand; -cbw(1i) 2 L 2 cbw(1.2i) 2 L 2 cbw(6i-3i) +tab(#); +cbw(1i) 2 L 2 cbw(1.2i) 2 L 2 cb cb L cb L cb -LfCW L CfCW L L. +LfCW L CfCW L Lx. Option (Abbreviation)##Default##Description _##_##_ From 4affdf735ffd834c48a40fdf2cc5c44b1768da59 Mon Sep 17 00:00:00 2001 From: "G. Branden Robinson" Date: Tue, 8 Oct 2024 03:39:39 -0500 Subject: [PATCH 08/15] src/appa.t: Use `x` tbl column modifier (2/2) Fixes: ./appa.t:1131: warning: table column separation reduced to zero --- src/appa.t | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/appa.t b/src/appa.t index de7e217..9d9ae74 100644 --- a/src/appa.t +++ b/src/appa.t @@ -1126,8 +1126,8 @@ Ahead or back to line matching .\" The list below need larger space between items. .\" /Andreas 2002-10-21 .TS -tab(#), expand; -lfCW lw(4i). +tab(#); +lfCW lx. abbrev#T{ .CW ab[\c .I "string text"\c From 3c23b2c193cc06a6d407ce8459958071a8aea65f Mon Sep 17 00:00:00 2001 From: "G. Branden Robinson" Date: Tue, 8 Oct 2024 03:42:52 -0500 Subject: [PATCH 09/15] src/utp.mac: Fix misuse of `PN` register No troff allows you to assign values expressed in roman numerals to registers. Further, as of groff 1.23.0, `PN` is an alias of the formatter's `%` register, so this assignment is unnecessary. Fixes: troff:./toc.t:69: warning: expected numeric expression, got character 'v' troff:./toc.t:131: warning: expected numeric expression, got character 'v' troff:./toc.t:195: warning: expected numeric expression, got character 'i' troff:./toc.t:255: warning: expected numeric expression, got character 'x' troff:./toc.t:323: warning: expected numeric expression, got character 'x' troff:./preface.t:150: warning: expected numeric expression, got character 'x' troff:./preface.t:372: warning: expected numeric expression, got character 'x' troff:./preface.t:531: warning: expected numeric expression, got character 'x' troff:./utp_book.t:20: warning: expected numeric expression, got character 'i' troff:./ch01.t:9: warning: expected numeric expression, got character 'i' --- src/utp.mac | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/utp.mac b/src/utp.mac index b566fd8..fee3f0b 100644 --- a/src/utp.mac +++ b/src/utp.mac @@ -205,7 +205,6 @@ Version of 16 November 2002 .\} .nr chapter_page2 1 \" Next page starts a chapter, so no header .if \\n[%]>1 .bp -.nr PN \\n[%] .ie '\\$3'NONE' .af PN i .el .af PN 1 .nr chapter_page 1 \" This page starts a chapter, number at bottom @@ -640,7 +639,6 @@ Version of 16 November 2002 \# .de utp_top .ev header_footer -.nr PN \\n[%] .if !\\n[chapter_page2] \{. \" if this page doesn't start a chapter . ie o .tl ''\\*[chapter_name]'\\n[PN]' . el .tl '\\n[PN]'\*[square] Unix Text Processing \*[square]'' From 5b2da5e0f4650ce2a23f404f00a131d88cf8a17e Mon Sep 17 00:00:00 2001 From: "G. Branden Robinson" Date: Tue, 8 Oct 2024 03:50:32 -0500 Subject: [PATCH 10/15] src/toc.awk: Fix dubious syntax AWK has different escaping rules for regex patterns `/xxx/` and strings `"xxx"`. Fixes: awk: toc.awk:17: warning: escape sequence `\(' treated as plain `(' awk: toc.awk:18: warning: escape sequence `\[' treated as plain `[' awk: toc.awk:18: warning: escape sequence `\]' treated as plain `]' --- src/toc.awk | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/toc.awk b/src/toc.awk index 3b27515..da90f0c 100755 --- a/src/toc.awk +++ b/src/toc.awk @@ -14,16 +14,16 @@ BEGIN { /^Se:/ { if ( $4 == "Contents" ) next; - gsub(/\\f\(CW/, "\\f\(CB" ); - gsub(/\\f\[CW\]/, "\\f\[CB\]" ); - gsub(/\\fC/, "\\f\[CB\]" ); + gsub(/\\f\(CW/, "\\f(CB" ); + gsub(/\\f\[CW\]/, "\\f[CB]" ); + gsub(/\\fC/, "\\f[CB]" ); print ".ps 12\n.sp"; print $3"\\h'|.25i'\\fB"$4"\\fR "$2; print ".ps 10\n.sp"; } /^Ah:/ { - gsub(/\\f\(CB/, "\\f\(CW" ); - gsub(/\\f\[CB\]/, "\\f\[CW\]" ); + gsub(/\\f\(CB/, "\\f(CW" ); + gsub(/\\f\[CB\]/, "\\f[CW]" ); print "\\h'|.25i'"$3""$2; } # default (skip index entries) From bf0a131f6902a33c46fe9e7022ac61fe1d9cbcc2 Mon Sep 17 00:00:00 2001 From: "G. Branden Robinson" Date: Tue, 8 Oct 2024 06:04:11 -0500 Subject: [PATCH 11/15] src/Makefile: Add dependencies on "utp.mac" Since the document's own macro definitions can impact formatting, make rules whose recipes run groff depend on the macro file. --- src/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Makefile b/src/Makefile index ae188b3..0f290a7 100644 --- a/src/Makefile +++ b/src/Makefile @@ -15,14 +15,14 @@ ch06.t ch07.t ch08.t ch09.t ch10.t ch11.t ch12.t ch13.t ch14.t \ ch15.t ch16.t ch17.t ch18.t appa.t appb.t appc.t appd.t appe.t \ appf.t appg.t -utp_book.ps: toc.t utp_ix.t - $(GROFF) -step -ms -rRef=0 utp_book.t >$@.tmp +utp_book.ps: toc.t utp_ix.t utp.mac + $(GROFF) -b -step -ms -rRef=0 utp_book.t >$@.tmp mv $@.tmp $@ clean:: rm -f utp_book.ps utp_book.ps.tmp -toc.t: $(CHAPTERS) +toc.t: $(CHAPTERS) utp.mac $(GROFF) -step -ms -rRef=1 ix.macro utp_book.t >/dev/null 2>utp.aux.tmp mv utp.aux.tmp utp.aux $(AWK) -f toc.awk utp.aux >$@.tmp From d3c1f94c4692a80212a7ab3a26a14eb39f341dad Mon Sep 17 00:00:00 2001 From: "G. Branden Robinson" Date: Tue, 8 Oct 2024 06:17:16 -0500 Subject: [PATCH 12/15] src/utp.mac: Simplify page breaking decision Don't start an output line before breaking the page when the page number is even. This, combined with spurious blank lines at the boundaries of chapter files, could lead to excess blank pages in the document. --- src/utp.mac | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/utp.mac b/src/utp.mac index fee3f0b..1d45539 100644 --- a/src/utp.mac +++ b/src/utp.mac @@ -160,10 +160,7 @@ Version of 16 November 2002 .de Se \" Section. $1: number, $2: name . \" $3: type (Chapter, Appendix, ...) . \" $4: non-null => don't map to uppercase -.if e \{\ -\& -.bp -.\} +.if e .bp .ds chapter_name \\$2 .ie !'\\$1'' \{. \" If we have a section number . ds chapter_head \\$1 From 82c386a400bf44684cbef4b8ccbd99ac2e61f75d Mon Sep 17 00:00:00 2001 From: "G. Branden Robinson" Date: Tue, 8 Oct 2024 06:15:03 -0500 Subject: [PATCH 13/15] src/ch{03,07,09,10}.t: Drop junk blank lines (1/2) Because a blank input line puts 1v of space on the output, these could interfere with placement of page breaks. --- src/ch03.t | 1 - src/ch07.t | 2 -- src/ch09.t | 1 - src/ch10.t | 2 -- 4 files changed, 6 deletions(-) diff --git a/src/ch03.t b/src/ch03.t index 0b8657c..69ac0cf 100644 --- a/src/ch03.t +++ b/src/ch03.t @@ -1,4 +1,3 @@ - .ig ch03.t Typed by: Heinz-Jürgen Oertel diff --git a/src/ch07.t b/src/ch07.t index 6d4a882..d9efa51 100644 --- a/src/ch07.t +++ b/src/ch07.t @@ -1,5 +1,3 @@ - - .ig Typed up by: Heinz-Jürgen Oertel Marked up by: Heinz-Jürgen Oertel diff --git a/src/ch09.t b/src/ch09.t index 9528927..3051586 100644 --- a/src/ch09.t +++ b/src/ch09.t @@ -1,4 +1,3 @@ - .ig Typed by: Michael Hobgood Marked up by: Michael Hobgood diff --git a/src/ch10.t b/src/ch10.t index eb8f1f3..20563b0 100644 --- a/src/ch10.t +++ b/src/ch10.t @@ -1,10 +1,8 @@ - .ig Typed by: Michael Hobgood Marked up by: Michael Hobgood Proofed on: 17 Oct 2002 .. - .so utp.mac .utp .ig From c48a3ca0054a9768396924391a5c06e3b2f16005 Mon Sep 17 00:00:00 2001 From: "G. Branden Robinson" Date: Tue, 8 Oct 2024 06:24:14 -0500 Subject: [PATCH 14/15] src/{app,ch}*.t: Drop junk blank lines (2/2) Because a blank input line puts 1v of space on the output, these could interfere with placement of page breaks. --- src/appb.t | 2 -- src/appg.t | 1 - src/ch01.t | 1 - src/ch02.t | 1 - src/ch05.t | 1 - src/ch06.t | 1 - src/ch07.t | 1 - src/ch08.t | 1 - src/ch11.t | 2 -- 9 files changed, 11 deletions(-) diff --git a/src/appb.t b/src/appb.t index 21b87c7..1a8bf60 100644 --- a/src/appb.t +++ b/src/appb.t @@ -2416,5 +2416,3 @@ l:n:l:l:n. .TE .poE .ix %end [pic] preprocessor, summary~of command~characters %key pic preprocessor, summary of command~characters - - diff --git a/src/appg.t b/src/appg.t index 70efdb3..069978b 100644 --- a/src/appg.t +++ b/src/appg.t @@ -53,4 +53,3 @@ A concise but thorough description of the UNIX .CW make utility. (63 pp.) - diff --git a/src/ch01.t b/src/ch01.t index f2cfa37..724b3b5 100644 --- a/src/ch01.t +++ b/src/ch01.t @@ -1048,4 +1048,3 @@ it can let you do just what a word processor does. In many more instances, it lets you use more of the computer to do things that a word processor either can't do or can't do very well. - diff --git a/src/ch02.t b/src/ch02.t index da0bfde..cb382d4 100644 --- a/src/ch02.t +++ b/src/ch02.t @@ -1191,4 +1191,3 @@ for users of the UNIX system\c \(em\c the mechanism by which all the other tools can be made to work together. - diff --git a/src/ch05.t b/src/ch05.t index ba54bbf..baed6a7 100644 --- a/src/ch05.t +++ b/src/ch05.t @@ -2258,4 +2258,3 @@ Many of these features are covered in Chapters 14 through 18, where, for example, we show macros for formatting numbered lists. .ix %end [ms] macros %key ms macros .\" end of chapter 5 - diff --git a/src/ch06.t b/src/ch06.t index 62ee435..3666504 100644 --- a/src/ch06.t +++ b/src/ch06.t @@ -4591,4 +4591,3 @@ In Chapter 14, you will learn about writing macro definitions, which should give you the information you need to write these supplementary \(lquser exit macros.\(rq - diff --git a/src/ch07.t b/src/ch07.t index d9efa51..e5373be 100644 --- a/src/ch07.t +++ b/src/ch07.t @@ -2860,4 +2860,3 @@ because you can store the commands in named buffers and access them in any file you edit. .ix %end [ex] editor %key ex editor .ix %end [vi] editor %key vi editor - diff --git a/src/ch08.t b/src/ch08.t index ae7ed19..fdfab6d 100644 --- a/src/ch08.t +++ b/src/ch08.t @@ -2353,4 +2353,3 @@ Assets\\a@41,645.8@34,434.7@32,876.6@27,987.6 .Pe .Fe " Input for Figure 8-3" .ix %end [tbl] preprocessor %key tbl preprocessor - diff --git a/src/ch11.t b/src/ch11.t index 0a02c3d..a774350 100644 --- a/src/ch11.t +++ b/src/ch11.t @@ -4236,5 +4236,3 @@ using Keeping a script of a procedure is also a good start for building a shell script that performs a routine task automatically. - - From c01123089e61c69118abeea9ad1115492fc2c16d Mon Sep 17 00:00:00 2001 From: "G. Branden Robinson" Date: Tue, 8 Oct 2024 06:29:15 -0500 Subject: [PATCH 15/15] src/utp.mac: Drop page break request The file "src/utp_book.t" handles page breaks (and page renumbering) between "sections" (chapter-like divisions of the text). --- src/utp.mac | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utp.mac b/src/utp.mac index 1d45539..437c2ec 100644 --- a/src/utp.mac +++ b/src/utp.mac @@ -201,7 +201,6 @@ Version of 16 November 2002 . \" Might be Preface, etc. so no error diag. .\} .nr chapter_page2 1 \" Next page starts a chapter, so no header -.if \\n[%]>1 .bp .ie '\\$3'NONE' .af PN i .el .af PN 1 .nr chapter_page 1 \" This page starts a chapter, number at bottom