About The Book

This lovely, well-written book is concerned foremost with creating typography and is essential for professionals who regularly work for clients.

Author writes about designing with the correct typeface; striving for rhythm, proportion, and harmony; choosing and combining type; designing pages; using section heads, subheads, footnotes, and tables; applying kerning and other type adjustments to improve legibility; and adding special characters, including punctuation and diacritical marks.

The Elements of Typographic Style teaches the history of and the artistic and practical perspectives on a variety of type families that are available in Europe and America today.

A few hundred years of type and typography have established rules that only a fool would ignore.

Reviews

4/5 (16 Reviews)

Alfred Rudolf

Dallas, Texas

This book is an excellent resource for anyone who is serious about graphic layout.

Emily Carey

Tampa, Florida

Swiss Typography is a critical guide for graphic designers. I recommend this fantastic eBook.

Martin Doe

Los Angeles, California

Chock full of great photos of lettering with a little info about the artist and projects shown.

Alfred Rudolf

Dallas, Texas

This book is an excellent resource for anyone who is serious about graphic layout.

Emily Carey

Tampa, Florida

Swiss Typography is a critical guide for graphic designers. I recommend this fantastic eBook.

Martin Doe

Los Angeles, California

Chock full of great photos of lettering with a little info about the artist and projects shown.

Nicolas Adamson

Typographer, Writer, Father...

Good typog­raphy is measured by how well it reinforces the meaning of the text, not by some ab­stract scale of merit.

Nullam quis risus eget urna mollis ornare vel eu leo Praesent commodo cursus magna, ligula porta felis euismod semper.l nisl consectetur etonec ullamcorper nulla non metus auctor fringilla. Nullam quis risus eget urna mollis ornare vel eu leo. Vestibulum id ligula porta felis euismod semper. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Maecenas faucibus mollis interdum.

Book Presentation

Stop by and meet the author

Public Presentation, TX, USA

06/20/2015
8:00 PM

Typography Expo, WA, USA

06/20/2015
8:00 PM

New York Expo 2015, NYC, USA

Europe Tour, Paris, FR

Europe Tour, Belgrade, SRB

Get The eBook Sample

Join over 5,600 readers and get free sample of the book.

Contact Author

Say hi or ask something.

James Richards

3130 Oaks Drive
Capitol Heights, MD 20027

+ 301 324 8521
info@frev.fun

Sending...
Whoops! There was an error.
ErrorException (E_WARNING)
file_put_contents(): Only 0 of 179 bytes written, possibly out of free disk space ErrorException thrown with message "file_put_contents(): Only 0 of 179 bytes written, possibly out of free disk space" Stacktrace: #7 ErrorException in /var/www/frev.fun/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:122 #6 file_put_contents in /var/www/frev.fun/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:122 #5 Illuminate\Filesystem\Filesystem:put in /var/www/frev.fun/vendor/laravel/framework/src/Illuminate/Session/FileSessionHandler.php:83 #4 Illuminate\Session\FileSessionHandler:write in /var/www/frev.fun/vendor/laravel/framework/src/Illuminate/Session/Store.php:129 #3 Illuminate\Session\Store:save in /var/www/frev.fun/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:87 #2 Illuminate\Session\Middleware\StartSession:terminate in /var/www/frev.fun/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:218 #1 Illuminate\Foundation\Http\Kernel:terminateMiddleware in /var/www/frev.fun/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:189 #0 Illuminate\Foundation\Http\Kernel:terminate in /var/www/frev.fun/public/index.php:60
7
ErrorException
/
vendor
/
laravel
/
framework
/
src
/
Illuminate
/
Filesystem
/
Filesystem.php
122
6
file_put_contents
/
vendor
/
laravel
/
framework
/
src
/
Illuminate
/
Filesystem
/
Filesystem.php
122
5
Illuminate
\
Filesystem
\
Filesystem
put
/
vendor
/
laravel
/
framework
/
src
/
Illuminate
/
Session
/
FileSessionHandler.php
83
4
Illuminate
\
Session
\
FileSessionHandler
write
/
vendor
/
laravel
/
framework
/
src
/
Illuminate
/
Session
/
Store.php
129
3
Illuminate
\
Session
\
Store
save
/
vendor
/
laravel
/
framework
/
src
/
Illuminate
/
Session
/
Middleware
/
StartSession.php
87
2
Illuminate
\
Session
\
Middleware
\
StartSession
terminate
/
vendor
/
laravel
/
framework
/
src
/
Illuminate
/
Foundation
/
Http
/
Kernel.php
218
1
Illuminate
\
Foundation
\
Http
\
Kernel
terminateMiddleware
/
vendor
/
laravel
/
framework
/
src
/
Illuminate
/
Foundation
/
Http
/
Kernel.php
189
0
Illuminate
\
Foundation
\
Http
\
Kernel
terminate
/
public
/
index.php
60
/
var
/
www
/
frev.fun
/
vendor
/
laravel
/
framework
/
src
/
Illuminate
/
Filesystem
/
Filesystem.php
     *
     * @param  string  $path
     * @return string
     */
    public function hash($path)
    {
        return md5_file($path);
    }
 
    /**
     * Write the contents of a file.
     *
     * @param  string  $path
     * @param  string  $contents
     * @param  bool  $lock
     * @return int
     */
    public function put($path, $contents, $lock = false)
    {
        return file_put_contents($path, $contents, $lock ? LOCK_EX : 0);
    }
 
    /**
     * Write the contents of a file, replacing it atomically if it already exists.
     *
     * @param  string  $path
     * @param  string  $content
     * @return void
     */
    public function replace($path, $content)
    {
        / If the path already exists and is a symlink, get the real path...
        clearstatcache(true, $path);
 
        $path = realpath($path) ?: $path;
 
        $tempPath = tempnam(dirname($path), basename($path));
 
        / Fix permissions of tempPath because `tempnam()` creates it with permissions set to 0600...
        chmod($tempPath, 0777 - umask());
Arguments
  1. "file_put_contents(): Only 0 of 179 bytes written, possibly out of free disk space"
    
/
var
/
www
/
frev.fun
/
vendor
/
laravel
/
framework
/
src
/
Illuminate
/
Filesystem
/
Filesystem.php
     *
     * @param  string  $path
     * @return string
     */
    public function hash($path)
    {
        return md5_file($path);
    }
 
    /**
     * Write the contents of a file.
     *
     * @param  string  $path
     * @param  string  $contents
     * @param  bool  $lock
     * @return int
     */
    public function put($path, $contents, $lock = false)
    {
        return file_put_contents($path, $contents, $lock ? LOCK_EX : 0);
    }
 
    /**
     * Write the contents of a file, replacing it atomically if it already exists.
     *
     * @param  string  $path
     * @param  string  $content
     * @return void
     */
    public function replace($path, $content)
    {
        / If the path already exists and is a symlink, get the real path...
        clearstatcache(true, $path);
 
        $path = realpath($path) ?: $path;
 
        $tempPath = tempnam(dirname($path), basename($path));
 
        / Fix permissions of tempPath because `tempnam()` creates it with permissions set to 0600...
        chmod($tempPath, 0777 - umask());
Arguments
  1. "/var/www/frev.fun/storage/framework/sessions/7cY6L3RJEyZUhvt3RbLA5yLFaNPKnwFxwOw4QZPO"
    
  2. "a:3:{s:6:"_token";s:40:"935AiZ2u9a6aefCMbg7gQy1hawKbcOYx3OJf9LgH";s:9:"_previous";a:1:{s:3:"url";s:21:"/178.62.206.225";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}}"
    
  3. 2
    
/
var
/
www
/
frev.fun
/
vendor
/
laravel
/
framework
/
src
/
Illuminate
/
Session
/
FileSessionHandler.php
    /**
     * {@inheritdoc}
     */
    public function read($sessionId)
    {
        if ($this->files->isFile($path = $this->path.'/'.$sessionId)) {
            if ($this->files->lastModified($path) >= Carbon::now()->subMinutes($this->minutes)->getTimestamp()) {
                return $this->files->sharedGet($path);
            }
        }
 
        return '';
    }
 
    /**
     * {@inheritdoc}
     */
    public function write($sessionId, $data)
    {
        $this->files->put($this->path.'/'.$sessionId, $data, true);
 
        return true;
    }
 
    /**
     * {@inheritdoc}
     */
    public function destroy($sessionId)
    {
        $this->files->delete($this->path.'/'.$sessionId);
 
        return true;
    }
 
    /**
     * {@inheritdoc}
     */
    public function gc($lifetime)
    {
        $files = Finder::create()
Arguments
  1. "/var/www/frev.fun/storage/framework/sessions/7cY6L3RJEyZUhvt3RbLA5yLFaNPKnwFxwOw4QZPO"
    
  2. "a:3:{s:6:"_token";s:40:"935AiZ2u9a6aefCMbg7gQy1hawKbcOYx3OJf9LgH";s:9:"_previous";a:1:{s:3:"url";s:21:"/178.62.206.225";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}}"
    
  3. true
    
/
var
/
www
/
frev.fun
/
vendor
/
laravel
/
framework
/
src
/
Illuminate
/
Session
/
Store.php
     *
     * @param  string  $data
     * @return string
     */
    protected function prepareForUnserialize($data)
    {
        return $data;
    }
 
    /**
     * Save the session data to storage.
     *
     * @return bool
     */
    public function save()
    {
        $this->ageFlashData();
 
        $this->handler->write($this->getId(), $this->prepareForStorage(
            serialize($this->attributes)
        ));
 
        $this->started = false;
    }
 
    /**
     * Prepare the serialized session data for storage.
     *
     * @param  string  $data
     * @return string
     */
    protected function prepareForStorage($data)
    {
        return $data;
    }
 
    /**
     * Age the flash data for the session.
     *
     * @return void
Arguments
  1. "7cY6L3RJEyZUhvt3RbLA5yLFaNPKnwFxwOw4QZPO"
    
  2. "a:3:{s:6:"_token";s:40:"935AiZ2u9a6aefCMbg7gQy1hawKbcOYx3OJf9LgH";s:9:"_previous";a:1:{s:3:"url";s:21:"/178.62.206.225";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}}"
    
/
var
/
www
/
frev.fun
/
vendor
/
laravel
/
framework
/
src
/
Illuminate
/
Session
/
Middleware
/
StartSession.php
        if ($this->sessionConfigured()) {
            $this->storeCurrentUrl($request, $session);
 
            $this->addCookieToResponse($response, $session);
        }
 
        return $response;
    }
 
    /**
     * Perform any final actions for the request lifecycle.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Symfony\Component\HttpFoundation\Response  $response
     * @return void
     */
    public function terminate($request, $response)
    {
        if ($this->sessionHandled && $this->sessionConfigured() && ! $this->usingCookieSessions()) {
            $this->manager->driver()->save();
        }
    }
 
    /**
     * Start the session for the given request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Contracts\Session\Session
     */
    protected function startSession(Request $request)
    {
        return tap($this->getSession($request), function ($session) use ($request) {
            $session->setRequestOnHandler($request);
 
            $session->start();
        });
    }
 
    /**
     * Get the session implementation from the manager.
/
var
/
www
/
frev.fun
/
vendor
/
laravel
/
framework
/
src
/
Illuminate
/
Foundation
/
Http
/
Kernel.php
     * @return void
     */
    protected function terminateMiddleware($request, $response)
    {
        $middlewares = $this->app->shouldSkipMiddleware() ? [] : array_merge(
            $this->gatherRouteMiddleware($request),
            $this->middleware
        );
 
        foreach ($middlewares as $middleware) {
            if (! is_string($middleware)) {
                continue;
            }
 
            [$name] = $this->parseMiddleware($middleware);
 
            $instance = $this->app->make($name);
 
            if (method_exists($instance, 'terminate')) {
                $instance->terminate($request, $response);
            }
        }
    }
 
    /**
     * Gather the route middleware for the given request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    protected function gatherRouteMiddleware($request)
    {
        if ($route = $request->route()) {
            return $this->router->gatherRouteMiddleware($route);
        }
 
        return [];
    }
 
    /**
Arguments
  1. Request {#42
      #json: null
      #convertedFiles: null
      #userResolver: Closure {#155
        class: "Illuminate\Auth\AuthServiceProvider"
        this: AuthServiceProvider {#41 …}
        parameters: {
          $guard: {
            default: null
          }
        }
        use: {
          $app: Application {#2 …}
        }
      }
      #routeResolver: Closure {#157
        class: "Illuminate\Routing\Router"
        this: Router {#25 …}
        use: {
          $route: Route {#131 …}
        }
      }
      +attributes: ParameterBag {#44}
      +request: ParameterBag {#50}
      +query: ParameterBag {#50}
      +server: ServerBag {#46}
      +files: FileBag {#47}
      +cookies: ParameterBag {#45}
      +headers: HeaderBag {#48}
      #content: null
      #languages: null
      #charsets: null
      #encodings: null
      #acceptableContentTypes: []
      #pathInfo: "/"
      #requestUri: "/"
      #baseUrl: ""
      #basePath: null
      #method: "GET"
      #format: null
      #session: Store {#182}
      #locale: null
      #defaultLocale: "en"
      -isHostValid: true
      -isForwardedValid: true
      basePath: ""
      format: "html"
    }
    
  2. Response {#198}
    
/
var
/
www
/
frev.fun
/
vendor
/
laravel
/
framework
/
src
/
Illuminate
/
Foundation
/
Http
/
Kernel.php
     */
    protected function dispatchToRouter()
    {
        return function ($request) {
            $this->app->instance('request', $request);
 
            return $this->router->dispatch($request);
        };
    }
 
    /**
     * Call the terminate method on any terminable middleware.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Http\Response  $response
     * @return void
     */
    public function terminate($request, $response)
    {
        $this->terminateMiddleware($request, $response);
 
        $this->app->terminate();
    }
 
    /**
     * Call the terminate method on any terminable middleware.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Http\Response  $response
     * @return void
     */
    protected function terminateMiddleware($request, $response)
    {
        $middlewares = $this->app->shouldSkipMiddleware() ? [] : array_merge(
            $this->gatherRouteMiddleware($request),
            $this->middleware
        );
 
        foreach ($middlewares as $middleware) {
            if (! is_string($middleware)) {
Arguments
  1. Request {#42
      #json: null
      #convertedFiles: null
      #userResolver: Closure {#155
        class: "Illuminate\Auth\AuthServiceProvider"
        this: AuthServiceProvider {#41 …}
        parameters: {
          $guard: {
            default: null
          }
        }
        use: {
          $app: Application {#2 …}
        }
      }
      #routeResolver: Closure {#157
        class: "Illuminate\Routing\Router"
        this: Router {#25 …}
        use: {
          $route: Route {#131 …}
        }
      }
      +attributes: ParameterBag {#44}
      +request: ParameterBag {#50}
      +query: ParameterBag {#50}
      +server: ServerBag {#46}
      +files: FileBag {#47}
      +cookies: ParameterBag {#45}
      +headers: HeaderBag {#48}
      #content: null
      #languages: null
      #charsets: null
      #encodings: null
      #acceptableContentTypes: []
      #pathInfo: "/"
      #requestUri: "/"
      #baseUrl: ""
      #basePath: null
      #method: "GET"
      #format: null
      #session: Store {#182}
      #locale: null
      #defaultLocale: "en"
      -isHostValid: true
      -isForwardedValid: true
      basePath: ""
      format: "html"
    }
    
  2. Response {#198}
    
/
var
/
www
/
frev.fun
/
public
/
index.php
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can handle the incoming request
| through the kernel, and send the associated response back to
| the client's browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/
 
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
 
$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);
 
$response->send();
 
$kernel->terminate($request, $response);
 
Arguments
  1. Request {#42
      #json: null
      #convertedFiles: null
      #userResolver: Closure {#155
        class: "Illuminate\Auth\AuthServiceProvider"
        this: AuthServiceProvider {#41 …}
        parameters: {
          $guard: {
            default: null
          }
        }
        use: {
          $app: Application {#2 …}
        }
      }
      #routeResolver: Closure {#157
        class: "Illuminate\Routing\Router"
        this: Router {#25 …}
        use: {
          $route: Route {#131 …}
        }
      }
      +attributes: ParameterBag {#44}
      +request: ParameterBag {#50}
      +query: ParameterBag {#50}
      +server: ServerBag {#46}
      +files: FileBag {#47}
      +cookies: ParameterBag {#45}
      +headers: HeaderBag {#48}
      #content: null
      #languages: null
      #charsets: null
      #encodings: null
      #acceptableContentTypes: []
      #pathInfo: "/"
      #requestUri: "/"
      #baseUrl: ""
      #basePath: null
      #method: "GET"
      #format: null
      #session: Store {#182}
      #locale: null
      #defaultLocale: "en"
      -isHostValid: true
      -isForwardedValid: true
      basePath: ""
      format: "html"
    }
    
  2. Response {#198}
    

Environment & details:

empty
empty
empty
empty
empty
Key Value
HTTP_HOST
"178.62.206.225"
HTTP_CONNECTION
"close"
HTTP_ACCEPT_ENCODING
"gzip"
HTTP_USER_AGENT
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
PATH
"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
SERVER_SIGNATURE
"<address>Apache/2.4.18 (Ubuntu) Server at 178.62.206.225 Port 80</address>\n"
SERVER_SOFTWARE
"Apache/2.4.18 (Ubuntu)"
SERVER_NAME
"178.62.206.225"
SERVER_ADDR
"178.62.206.225"
SERVER_PORT
"80"
REMOTE_ADDR
"54.160.34.192"
DOCUMENT_ROOT
"/var/www/frev.fun/public"
REQUEST_SCHEME
"http"
CONTEXT_PREFIX
""
CONTEXT_DOCUMENT_ROOT
"/var/www/frev.fun/public"
SERVER_ADMIN
"admin@frev.fun"
SCRIPT_FILENAME
"/var/www/frev.fun/public/index.php"
REMOTE_PORT
"59200"
GATEWAY_INTERFACE
"CGI/1.1"
SERVER_PROTOCOL
"HTTP/1.1"
REQUEST_METHOD
"GET"
QUERY_STRING
""
REQUEST_URI
"/"
SCRIPT_NAME
"/index.php"
PHP_SELF
"/index.php"
REQUEST_TIME_FLOAT
1551073598.736
REQUEST_TIME
1551073598
APP_NAME
"Laravel"
APP_ENV
"local"
APP_KEY
"base64:EHpVa4E2zPceFJHUiWjh0ahtPJItfLi3UIxMSeIGN7I="
APP_DEBUG
"true"
APP_URL
"/frev.fun/"
LOG_CHANNEL
"stack"
DB_CONNECTION
"mysql"
DB_HOST
"127.0.0.1"
DB_PORT
"3306"
DB_DATABASE
"kolkhoz_farm_1"
DB_USERNAME
"root"
DB_PASSWORD
"developer12345"
DB_HOST_SECOND
"127.0.0.1"
DB_PORT_SECOND
"3306"
DB_DATABASE_SECOND
"kolkhoz_farm_3"
DB_USERNAME_SECOND
"root"
DB_PASSWORD_SECOND
"developer12345"
BROADCAST_DRIVER
"log"
CACHE_DRIVER
"file"
QUEUE_CONNECTION
"sync"
SESSION_DRIVER
"file"
SESSION_LIFETIME
"120"
REDIS_HOST
"127.0.0.1"
REDIS_PASSWORD
"null"
REDIS_PORT
"6379"
MAIL_DRIVER
"smtp"
MAIL_HOST
"smtp.mailtrap.io"
MAIL_PORT
"2525"
MAIL_USERNAME
"null"
MAIL_PASSWORD
"null"
MAIL_ENCRYPTION
"null"
PUSHER_APP_ID
""
PUSHER_APP_KEY
""
PUSHER_APP_SECRET
""
PUSHER_APP_CLUSTER
"mt1"
MIX_PUSHER_APP_KEY
""
MIX_PUSHER_APP_CLUSTER
"mt1"
Key Value
APP_NAME
"Laravel"
APP_ENV
"local"
APP_KEY
"base64:EHpVa4E2zPceFJHUiWjh0ahtPJItfLi3UIxMSeIGN7I="
APP_DEBUG
"true"
APP_URL
"/frev.fun/"
LOG_CHANNEL
"stack"
DB_CONNECTION
"mysql"
DB_HOST
"127.0.0.1"
DB_PORT
"3306"
DB_DATABASE
"kolkhoz_farm_1"
DB_USERNAME
"root"
DB_PASSWORD
"developer12345"
DB_HOST_SECOND
"127.0.0.1"
DB_PORT_SECOND
"3306"
DB_DATABASE_SECOND
"kolkhoz_farm_3"
DB_USERNAME_SECOND
"root"
DB_PASSWORD_SECOND
"developer12345"
BROADCAST_DRIVER
"log"
CACHE_DRIVER
"file"
QUEUE_CONNECTION
"sync"
SESSION_DRIVER
"file"
SESSION_LIFETIME
"120"
REDIS_HOST
"127.0.0.1"
REDIS_PASSWORD
"null"
REDIS_PORT
"6379"
MAIL_DRIVER
"smtp"
MAIL_HOST
"smtp.mailtrap.io"
MAIL_PORT
"2525"
MAIL_USERNAME
"null"
MAIL_PASSWORD
"null"
MAIL_ENCRYPTION
"null"
PUSHER_APP_ID
""
PUSHER_APP_KEY
""
PUSHER_APP_SECRET
""
PUSHER_APP_CLUSTER
"mt1"
MIX_PUSHER_APP_KEY
""
MIX_PUSHER_APP_CLUSTER
"mt1"
0. Whoops\Handler\PrettyPageHandler