mfirstuc.sty v2.06: uppercasing first letter

Similar documents
glossaries-extra.sty v1.26: an extension to the glossaries package

glossaries-extra.sty v1.29: an extension to the glossaries package

glossaries-extra.sty v1.38: documented code

The hypbmsec package

Documented Code For glossaries v4.40

The newunicodechar package

The xparse package Document command parser

Meeting One. Aaron Ecay. February 2, 2011

Documented Code For glossaries v4.35

L A TEX. COMPSCI 111 / 111G Mastering Cyberspace: An introduction to practical computing. LaTeX. Development. Why?

pressrelease v1.0: typesetting press releases

Estonian language support for babel

1 Definitions for the LCY encoding

Absolute L A TEX Beginner

Square cells: an array cooking lesson

The textcase package

Documented Code for datatool v2.29

bibleref.sty (1.17a): a L A TEX 2ε package for typesetting bible references

M. R. C. van Dongen. ucc. LaTEX and Friends. Commands and Environments. Marc van Dongen

Introduction to L A TEX for MCS-236

The xparse package Document command parser

TUGboat, Volume 31 (2010), No. 1 83

Using L A TEX. A numbered list is just that a collection of items sorted and labeled by number.

simpletex Documentation

Lecture 1: Short summary of LaTeX basics

Introduction to Scientific Typesetting Lesson 1: Getting Started

These are notes for the third lecture; if statements and loops.

The svn package. Richard Lewis 25th September 2007

FiNK the L A TEX2ε File Name Keeper

This is the LYX Beamer Template

Manual for uoftexam.sty by Martin J. Osborne Version 1.8, October 2017

L A TEX Tutorial. 1 Introduction. 2 Running L A TEX. J. E. Rice. May 2010

CODING STYLE. Contents 1. List of style comments 1 2. Other chapters 3 References 5

Getting ready for L A TEX. Alexis Dimitriadis. Version: March 28, 2013

This book is licensed under a Creative Commons Attribution 3.0 License

Become a L A TEX Guru

L A T E X Week 11, Other Document Classes

The listproc package

Version v2.01, 2000/06/29

Cindex 3.0 for Windows. Release Notes

Rule 1-3: Use white space to break a function into paragraphs. Rule 1-5: Avoid very long statements. Use multiple shorter statements instead.

The compiler is spewing error messages.

The l3galley package Galley code

Running Java Programs

CSE413: Programming Languages and Implementation Racket structs Implementing languages with interpreters Implementing closures

biblatex-publist Jürgen Spitzmüller Version 1.8, 2017/11/14

WinTeX Documentation

Math 235: Introduction to LaTeX

Omit passages optionally under L A TEX. Uwe Lück 2005/04/28

Topic 1: Introduction

Documented Code For glossaries v4.15

The ted package. Manuel Pégourié-Gonnard v1.06 (2008/03/07) 1 Introduction 1. 2 Usage 1. 3 Implementation 3

The alphalph package

srcltx.sty srctex.sty

DINO. Language Reference Manual. Author: Manu Jain

The MathType Window. The picture below shows MathType with all parts of its toolbar visible: Small bar. Tabs. Ruler. Selection.

L A TEX Primer. Randall R. Holmes. August 17, 2018

L A TEX: Eh? What is it, what isn t it, who cares? Andy Caird. LATEX: Eh? p.1/13

$parser->parse_from_file ('file.pod', 'file.tex');

CSE341: Programming Languages Lecture 17 Implementing Languages Including Closures. Dan Grossman Autumn 2018

Outline. Installing LaTeX. Opening TeXShop. Intro to LaTeX. Intro to LaTeX interface Working with text Tabbing and tables Figures Math and equations

CSS. Text & Font Properties. Copyright DevelopIntelligence LLC

Pimp your thesis: a minimal introduction to L A T E X.

Keep Track of Your Passwords Easily

Documented Code for datatool v2.23

The svn-prov package

preliminary draft, March 26, :20 preliminary draft, March 26, :20

How To Get Your Word Document. Ready For Your Editor

This document provides a concise, introductory lesson in HTML formatting.

QUIZ. What is wrong with this code that uses default arguments?

Preparing Z specifications using LaTeX markup

An Alternative to Name Injection from Templates

Creating a LaTeX Minimal Example

Part - I : Short Course Typing Text

Computer Science & Information Technology (CS) Rank under AIR 100. Examination Oriented Theory, Practice Set Key concepts, Analysis & Summary

The gloss Package. Jose Luis Díiaz Javier Bezos. October 10, 1999

GNU Emacs as a Front End to L A TEX

LaTeX, automata,computability, and notation. CS154 Chris Pollett Jan. 25, 2006.

Using ShareLaTeX to make Trees

Simple Math. Adam Dishaw 2011 September 21. Suppose you want to include some math in your documents. Just follow these basics steps:

Assignment 0. Nothing here to hand in

LaTeX and Turing Machines. CS254 Chris Pollett Aug. 30, 2006.

The xargs package. Manuel Pégourié-Gonnard v1.1 (2008/03/22) 1 Introduction 1. 2 Usage 1

Introduction to MCS 220 and L A TEX

Using LaTex and BibTex to Write Academic Documents. Ligang He Department of Computer Science University of Warwick

Documented Code For glossaries v4.11

C Language, Token, Keywords, Constant, variable

Homework # You ll want to use some LaTeX editor to edit and compile your.tex files

Introduction to LATEX

altfont: Using alternative fonts

flex is not a bad tool to use for doing modest text transformations and for programs that collect statistics on input.

CS 189 L A TEX and Linux: Document Layout and Organization

Performing searches on Érudit

INF FALL NATURAL LANGUAGE PROCESSING. Jan Tore Lønning, Lecture 4, 10.9

Introduction to LAT E X

Introduction to Scientific Typesetting Lesson 11: Foreign Languages, Columns, and Section Titles

Typesafe cross-referencing with typedref

Create web pages in HTML with a text editor, following the rules of XHTML syntax and using appropriate HTML tags Create a web page that includes

Language Basics. /* The NUMBER GAME - User tries to guess a number between 1 and 10 */ /* Generate a random number between 1 and 10 */

COMP496/901: Academic Presentation and Writing Skills Using LaTeX

Transcription:

mfirstuc.sty v2.06: uppercasing first letter Nicola L.C. Talbot Dickimaw Books http://www.dickimaw-books.com/ 2017-11-14 1

Contents 1 Introduction 3 2 Capitalising the First Letter of a Word 5 3 Capitalise the First Letter of Each Word in a Phrase or Sentence (Title Case) 8 3.1 PDF Bookmarks................................. 14 3.2 Excluding Words From Case-Changing................... 14 4 UTF-8 17 Index 20 2

1 Introduction The mfirstuc package was originally part of the glossaries bundle for use with commands like \Gls, but as the commands provided by mfirstuc may be used without glossaries, the two have been split into separately maintained packages. The commands described here all have limitations. To minimise problems, use text-block style semantic commands with one argument (the text that requires case-changing), and avoid scoped declarations. Here are some examples of semantic commands: 1. Quoted material: \newcommand{\qt}[1]{``#1''} (or use the csquotes package). With this, the following works: \makefirstuc{\qt{word}} This Word Whereas \makefirstuc{``word''} fails (no case-change and double open quote becomes two single open quotes): word 2. Font styles or colours: \newcommand*{\alert}[1]{\textcolor{red}{#1}} Now the following is possible: \makefirstuc{\alert{word}} 3

This produces Word Note that \makefirstuc{\textcolor{red}{word}} fails (with an error) because the case-changing interferes with the label. Define these semantic commands robustly if you intend using any of the commands that fully expand their argument (\emakefirstuc, \ecapitalisewords and \ecapitalisefmtwords). 4

2 Capitalising the First Letter of a Word A simple word can be capitalised just using the standard LATEX upper casing command. For example, \MakeUppercase word but for commands like \Gls the word may be embedded within the argument of another command, such as a font changing command. This makes things more complicated for a general purpose solution, so the mfirstuc package provides: \makefirstuc \makefirstuc{ stuff } This makes the first object of stuff upper case unless stuff starts with a control sequence followed by a non-empty group, in which case the first object in the group is converted to upper case. No expansion is performed on the argument. If stuff starts with a control sequence that takes more than one argument, the case-changing will always be applied to the first argument. If the text that requires the case change is in one of the other arguments, you must hide the earlier arguments in a wrapper command. For example, instead of \textcolor{red}{text} you need to define, say, \red as \color{red} and use \red{text}. Examples: \makefirstuc{abc} produces Abc. \makefirstuc{\emph{abc}} produces Abc (\MakeUppercase has been applied to the letter a rather than \emph). Note however that \makefirstuc{{\em abc}} produces ABC (first object is {\em abc} so this is equivalent to \MakeUppercase{\em abc}), and {\makefirstuc{\em abc}} produces abc (\em doesn t have an argument therefore first object is \em and so is equivalent to {\MakeUppercase{\em}abc}). 5

\makefirstuc{{\ a}bc} produces Ábc. \makefirstuc{\ae bc} produces Æbc. \makefirstuc{{\ae}bc} produces Æbc. \makefirstuc{{ä}bc} produces Äbc. Note that non-latin or accented characters appearing at the start of the text should be placed in a group (even if you are using the inputenc package). The reason for this restriction is detailed in Section 4. New to version 2.04: There is now limited support for UTF-8 characters with the inputenc package, provided that you load datatool-base (at least v2.24) before mfirstuc (datatool-base is loaded automatically with newer versions of glossaries). If available mfirstuc will now use datatool-base s \dtl@getfirst@utfviii command which is still experimental. See the datatool manual for further details. \documentclass{article} \usepackage[t1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{datatool-base}[2016/01/12]% v2.24+ \usepackage{mfirstuc} \begin{document} \makefirstuc{élite} \end{document} (Package ordering is important.) In version 1.02 of mfirstuc, a bug fix resulted in a change in output if the first object is a control sequence followed by an empty group. Prior to version 1.02, \makefirstuc{\ae{}bc} produced æbc. However as from version 1.02, it now produces Æbc. Note also that \newcommand{\abc}{abc} \makefirstuc{\abc} ABC. This is because the first object in the argument of \makefirstuc is \abc, so it does \MakeUppercase{\abc}. Whereas: \newcommand{\abc}{abc} \expandafter\makefirstuc\expandafter{\abc} 6

Abc. There is a short cut command which will do this: \xmakefirstuc \xmakefirstuc{ stuff } This is equivalent to \expandafter\makefirstuc\expandafter{ stuff }. So \newcommand{\abc}{abc} \xmakefirstuc{\abc} Abc. \xmakefirstuc only performs one level expansion on the first object in its argument. It does not fully expand the entire argument. As from version 1.10, there is now a command that fully expands the entire argument before applying \makefirstuc: \emakefirstuc \emakefirstuc{ text } Examples: \newcommand{\abc}{\xyz a} \newcommand{\xyz}{xyz} No expansion: \makefirstuc{\abc}. First object one-level expansion: \xmakefirstuc{\abc}. Fully expanded: \emakefirstuc{\abc}. No expansion: XYZA. First object one-level expansion: XYZa. Fully expanded: Xyza. If you use mfirstuc without the glossaries package, the standard \MakeUppercase command is used. If used with glossaries, \MakeTextUppercase (defined by the textcase package) is used instead. If you are using mfirstuc without the glossaries package and want to use \MakeTextUppercase instead, you can redefine \glsmakefirstuc \glsmakefirstuc{ text } For example: \renewcommand{\glsmakefirstuc}[1]{\maketextuppercase #1} Remember to also load textcase (glossaries loads this automatically). 7

3 Capitalise the First Letter of Each Word in a Phrase or Sentence (Title Case) New to mfirstuc v1.06: \capitalisewords \capitalisewords{ text } This command applies \makefirstuc to each word in text where the space character is used as the word separator. Note that it has to be a plain space character, not another form of space, such as ~ or \space. Note that no expansion is performed on text. See Section 3.2 for excluding words (such as of ) from the case-changing. The actual capitalisation of each word is done using (new to version 2.03): \MFUcapword \MFUcapword{ word } This just does \makefirstuc{ word } by default, but its behaviour is determined by the conditional: \ifmfuhyphen \ifmfuhyphen If you want to title case each part of a compound word containing hyphens, you can enable this using \MFUhyphentrue \MFUhyphentrue or switch it back off again using: \MFUhyphenfalse \MFUhyphenfalse Compare \capitalisewords{server-side includes} which Server-side Includes with 8

\MFUhyphentrue \capitalisewords{server-side includes} which Server-Side Includes Formatting for the entire phrase must go outside \capitalisewords (unlike \makefirstuc). Compare: \capitalisewords{\textbf{a sample phrase}} which A sample phrase with: \textbf{\capitalisewords{a sample phrase}} which A Sample Phrase As from version 2.03, there is now a command for phrases that may include a formatting command: \capitalisefmtwords{ phrase } where phrase may be just words (as with \capitalisewords) or may be entirely enclosed in a formatting command in the form \capitalisefmtwords{ cs { phrase }} or contain formatted sub-phrases \capitalisefmtwords{ words cs { sub-phrase } words } Avoid scoped declarations. \capitalisefmtwords is only designed for phrases that contain text-block commands with a single argument, which should be a word or sub-phrase. Anything more complicated is likely to break. Instead, use the starred form or \capitalisewords. The starred form only permits a text-block command at the start of the phrase. Examples: 9

1. Phrase entirely enclosed in a formatting command: \capitalisefmtwords{\textbf{a small book of rhyme}} A Small Book Of Rhyme 2. Sub-phrase enclosed in a formatting command: \capitalisefmtwords{a \textbf{small book} of rhyme} A Small Book Of Rhyme 3. Nested text-block commands: \capitalisefmtwords{\textbf{a \emph{small book}} of rhyme} A Small Book Of Rhyme 4. Indicating words that shouldn t have the case changed (see Section 3.2): \MFUnocap{of} \capitalisefmtwords{\textbf{a \emph{small book}} of rhyme} A Small Book of Rhyme 5. Starred form: \MFUnocap{of} \capitalisefmtwords*{\emph{a small book of rhyme}} 10

A Small Book of Rhyme 6. The starred form also works with just text (no text-block command): \MFUnocap{of} \capitalisefmtwords*{a small book of rhyme} A Small Book of Rhyme If there is a text-block command within the argument of the starred form, it s assumed to be at the start of the argument. Unexpected results can occur if there are other commands. For example \MFUnocap{of} \capitalisefmtwords*{\emph{a small} book \textbf{of rhyme}} A Small Book Of rhyme (In this case \textbf{of rhyme} is considered a single word.) Similarly if the textblock command occurs in the middle of the argument: \MFUnocap{of} \capitalisefmtwords*{a \emph{very small} book of rhyme} A Very small Book of Rhyme (In this case \emph{very small} is considered a single word.) Grouping causes interference: \capitalisefmtwords{{a \emph{small book}} of rhyme} A Small book Of Rhyme As with all the commands described here, avoid declarations. For example, the following fails: \capitalisefmtwords{{\bfseries a \emph{small book}} of rhyme} 11

a Small book Of Rhyme Avoid complicated commands in the unstarred version. For example, the following breaks: \newcommand*{\swap}[2]{{#2}{#1}} \capitalisefmtwords{a \swap{bo}{ok} of rhyme} However it works okay with the starred form and the simpler \capitalisewords: \newcommand*{\swap}[2]{{#2}{#1}} \capitalisefmtwords*{a \swap{bo}{ok} of rhyme} \capitalisewords{a \swap{bo}{ok} of rhyme} Produces: A okbo Of Rhyme A okbo Of Rhyme Note that the case change is applied to the first argument. \xcapitalisewords \xcapitalisewords{ text } This is a short cut for \expandafter\capitalisewords\expandafter{ text }. As from version 1.10, there is now a command that fully expands the entire argument before applying \capitalisewords: \ecapitalisewords \ecapitalisewords{ text } There are also similar shortcut commands for the version that allows text-block commands: \xcapitalisefmtwords \xcapitalisefmtwords{ text } The unstarred version is a short cut for \expandafter\capitalisefmtwords\expandafter { text }. Similarly the starred version of \xcapitalisefmtwords uses the starred version of \capitalisefmtwords. For full expansion: \ecapitalisefmtwords \ecapitalisefmtwords{ text } Take care with this as it may expand non-robust semantic commands to replacement text that breaks the functioning of \capitalisefmtwords. Use robust seman- 12

tic commands where possible. Again this has a starred version that uses the starred form of \capitalisefmtwords. Examples: \newcommand{\abc}{\xyz\space four five} \newcommand{\xyz}{one two three} No expansion: \capitalisewords{\abc}. First object one-level expansion: \xcapitalisewords{\abc}. Fully expanded: \ecapitalisewords{\abc}. No expansion: ONE TWO THREE FOUR FIVE. First object one-level expansion: ONE TWO THREE four Five. Fully expanded: One Two Three Four Five. (Remember that the spaces need to be explicit. In the second case above, using \xcapitalisewords, the space before four has been hidden within \space so it s not recognised as a word boundary, but in the third case, \space has been expanded to an actual space character.) Examples: 1. \capitalisewords{a book of rhyme.} A Book Of Rhyme. 2. \capitalisewords{a book\space of rhyme.} A Book of Rhyme. 3. \newcommand{\mytitle}{a book\space of rhyme.} \capitalisewords{\mytitle} A BOOK OF RHYME. (No expansion is performed on \mytitle.) Compare with next example: 4. \newcommand{\mytitle}{a book\space of rhyme.} \xcapitalisewords{\mytitle} A Book of Rhyme. However \ecapitalisewords{\mytitle} A Book Of Rhyme. (\space has been expanded to an actual space character.) 5. \newcommand*{\swap}[2]{{#2}{#1}} \capitalisewords{a \swap{bo}{ok} of rhyme} 13

\ecapitalisewords{a \swap{bo}{ok} of rhyme} A okbo Of Rhyme A OKbo Of Rhyme This is because the argument of \ecapitalisewords is fully expanded before being passed to \capitalisewords so that last example is equivalent to: \capitalisewords{a {ok}{bo} of rhyme} 3.1 PDF Bookmarks If you are using hyperref and want to use \capitalisewords, \capitalisefmtwords or \makefirstuc (or the expanded variants) in a section heading, the PDF bookmarks won t be able to use the command as it s not expandable, so you will get a warning that looks like: Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding): (hyperref) removing `\capitalisewords' If you want to provide an alternative for the PDF bookmark, you can use hyperref s \texorpdfstring command. For example: \chapter{\texorpdfstring {\capitalisewords{a book of rhyme}}% TeX {A Book of Rhyme}% PDF } Alternatively, you can use hyperref s mechanism for disabling commands within the bookmarks. For example: \pdfstringdefdisablecommands{% \let\capitalisewords\@firstofone } See the hyperref manual for further details. 3.2 Excluding Words From Case-Changing As from v1.09, you can specify words which shouldn t be capitalised unless they occur at the start of text using: 14

\MFUnocap \MFUnocap{ word } This only has a local effect. The global version is: \gmfunocap \gmfunocap{ word } For example: \capitalisewords{the wind in the willows} \MFUnocap{in}% \MFUnocap{the}% \capitalisewords{the wind in the willows} The Wind In The Willows The Wind in the Willows The list of words that shouldn t be capitalised can be cleared using \MFUclear \MFUclear You can also simply place an empty group in front of a word if you don t want that specific instance to be capitalised. For example: \MFUclear \capitalisewords{the {}wind in the willows} The wind In The Willows This is also a useful way of protecting commands that shouldn t be parsed. For example: \capitalisewords{this is section {}\nameref{sec:nocap}.} produces This Is Section Excluding Words From Case-Changing. (No case-changing is applied to \nameref{sec:nocap}. It just happens to already be in title case.) The package mfirstuc-english loads mfirstuc and uses \MFUnocap to add common English articles and conjunctions, such as a, an, and, but. You may want to add 15

other words to this list, such as prepositions but, as there s some dispute over whether prepositions should be capitalised, I don t intend to add them to this package. If you want to write a similar package for another language, all you need to do is create a file with the extension.sty that starts with \NeedsTeXFormat{LaTeX2e} The next line should identify the package. For example, if you have called the file mfirstuc-french.sty then you need: \ProvidesPackage{mfirstuc-french} It s a good idea to also add a version in the final optional argument, for example: \ProvidesPackage{mfirstuc-french}[2014/07/30 v1.0] Next load mfirstuc: \RequirePackage{mfirstuc} Now add all your \MFUnocap commands. For example: \MFUnocap{de} At the end of the file add: \endinput Put the file somewhere on TEX s path, and now you can use this package in your document. You might also consider uploading it to CTAN in case other users find it useful. 16

4 UTF-8 The \makefirstuc command works by utilizing the fact that, in most cases, TEX doesn t require a regular argument to be enclosed in braces if it only consists of a single token. (This is why you can do, say, \frac12 instead of \frac{1}{2} or x^2 instead of x^{2}, although some users frown on this practice.) A simplistic version of the \makefirstuc command is: \newcommand*{\firstuc}[1]{\makeuppercase #1} Here \FirstUC{abc} is equivalent to \MakeUppercase abc and since \MakeUppercase requires an argument, it grabs the first token (the character a in this case) and uses that as the argument so that the result is: Abc. The glossaries package needs to take into account the fact that the text may be contained in the argument of a formatting command, such as \acronymfont, so \makefirstuc has to be more complicated than the trivial \FirstUC shown above, but at its basic level, \makefirstuc uses this same method and is the reason why, in most cases, you don t need to enclose the first character in braces. So if \MakeUppercase stuff works, then \makefirstuc{ stuff } should also work and so should \makefirstuc{\foo{ stuff }} but if \MakeUppercase stuff doesn t work, then neither will \makefirstuc{ stuff } nor 17

\makefirstuc{\foo{ stuff }} Try the following document: \documentclass{article} \usepackage[utf8]{inputenc} \usepackage[t1]{fontenc} \begin{document} \MakeUppercase ãbc \end{document} This will result in the error:! Argument of \UTFviii@two@octets has an extra }. This is why \makefirstuc{ãbc} won t work. It will only work if the character ã is placed inside a group. The reason for this error message is due to TEX having been written before Unicode was invented. Although ã may look like a single character in your text editor, from TEX s point of view it s two tokens. So \MakeUppercase ãbc tries to apply \MakeUppercase to just the first octet of ã. This means that the second octet has been separated from the first octet, which is the cause of the error. In this case the argument isn t a single token, so the two tokens (the first and second octet of ã) must be grouped: \MakeUppercase{ã}bc Note that X TEX (and therefore X LATEX) is a modern implementation of TEX designed to work with Unicode and therefore doesn t suffer from this drawback. Now let s look at the X LATEX equivalent of the above example: \documentclass{article} \usepackage{fontspec} \begin{document} \MakeUppercase ãbc \end{document} E E E 18

This works correctly when compiled with X LATEX. This means that \makefirstuc{ãbc} will work provided you use X LATEX and the fontspec package. Version 2.24 of datatool-base added the command \dtl@getfirst@utfviii which attempts to grab both octets. If this command has been defined, mfirstuc will use it when it tries to split the first character from the rest of the word. See the datatool documented code for further details. E E 19

Index C \capitalisewords.... 8 D datatool-base package 6, 19 E \ecapitalisefmtwords.............. 12 \ecapitalisewords.. 12 \emakefirstuc....... 7 F fontspec package...... 19 G glossaries package.. 6, 7, 17 \glsmakefirstuc..... 7 \gmfunocap......... 15 H hyperref package...... 14 I \ifmfuhyphen........ 8 inputenc package....... 6 M \makefirstuc........ 5 mfirstuc package.... 6, 19 mfirstuc-english package 15 \MFUcapword......... 8 \MFUclear.......... 15 \MFUhyphenfalse..... 8 \MFUhyphentrue...... 8 \MFUnocap.......... 15 T textcase package....... 7 X \xcapitalisefmtwords.............. 12 \xcapitalisewords.. 12 \xmakefirstuc....... 7 20