├── .github ├── dependabot.yml └── workflows │ ├── build.yml │ ├── coverage.yml │ ├── prepare-release.yml │ └── publish-crate.yml ├── .gitignore ├── Cargo.toml ├── LICENSE ├── README.md ├── benches ├── generate.rs └── learn.rs ├── examples └── lipsum.rs ├── src ├── lib.rs ├── liber-primus.txt └── lorem-ipsum.txt └── tests └── version-numbers.rs /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # Please see the documentation for all configuration options: 2 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 3 | 4 | version: 2 5 | updates: 6 | - package-ecosystem: cargo 7 | directory: / 8 | schedule: 9 | interval: monthly 10 | commit-message: 11 | prefix: cargo 12 | groups: 13 | minor: 14 | update-types: 15 | - minor 16 | patch: 17 | update-types: 18 | - patch 19 | - package-ecosystem: github-actions 20 | directory: / 21 | schedule: 22 | interval: monthly 23 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: 4 | pull_request: 5 | push: 6 | branches: 7 | - master 8 | 9 | env: 10 | CARGO_TERM_COLOR: always 11 | FORCE_COLOR: 3 12 | RUSTFLAGS: -D warnings 13 | 14 | jobs: 15 | 16 | build: 17 | name: Build 18 | strategy: 19 | matrix: 20 | rust: 21 | - stable 22 | - nightly 23 | os: 24 | - ubuntu-latest 25 | - windows-latest 26 | exclude: 27 | - rust: nightly 28 | os: windows-latest 29 | fail-fast: false 30 | runs-on: ${{ matrix.os }} 31 | 32 | steps: 33 | - name: Checkout repository 34 | uses: actions/checkout@v4 35 | 36 | - name: Install ${{ matrix.rust }} Rust 37 | run: rustup default ${{ matrix.rust }} 38 | 39 | - uses: Swatinem/rust-cache@v2 40 | 41 | - name: Test 42 | run: cargo test 43 | 44 | # This checks examples and benchmarks, which are not covered above. 45 | - name: Check all targets 46 | if: matrix.rust == 'nightly' 47 | run: cargo check --all-targets 48 | 49 | msrv: 50 | name: Build MSRV 51 | runs-on: ubuntu-latest 52 | 53 | steps: 54 | - name: Checkout repository 55 | uses: actions/checkout@v4 56 | 57 | - name: Detect MSRV 58 | run: echo MSRV=$(grep 'rust-version' Cargo.toml | cut -d '"' -f 2) >> "$GITHUB_ENV" 59 | 60 | - name: Install Rust ${{ env.MSRV }} 61 | run: rustup default $MSRV 62 | 63 | - uses: Swatinem/rust-cache@v2 64 | 65 | - name: Build 66 | run: cargo build 67 | 68 | build-documentation: 69 | name: Build documentation 70 | runs-on: ubuntu-latest 71 | steps: 72 | - name: Checkout repository 73 | uses: actions/checkout@v4 74 | 75 | - uses: Swatinem/rust-cache@v2 76 | 77 | - name: Build documentation and check intra-doc links 78 | env: 79 | RUSTDOCFLAGS: --deny rustdoc::broken_intra_doc_links 80 | run: cargo doc --no-deps 81 | 82 | clippy: 83 | name: Clippy 84 | runs-on: ubuntu-latest 85 | steps: 86 | - name: Checkout repository 87 | uses: actions/checkout@v4 88 | 89 | - uses: Swatinem/rust-cache@v2 90 | 91 | - name: Clippy with default lints 92 | run: cargo clippy 93 | 94 | - name: Lint for left-over debug prints 95 | run: cargo clippy -- -D clippy::print_stdout -D clippy::print_stderr 96 | -------------------------------------------------------------------------------- /.github/workflows/coverage.yml: -------------------------------------------------------------------------------- 1 | name: coverage 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | env: 9 | CARGO_TERM_COLOR: always 10 | 11 | jobs: 12 | coverage: 13 | name: Generate coverage 14 | runs-on: ubuntu-latest 15 | steps: 16 | - name: Checkout repository 17 | uses: actions/checkout@v4 18 | 19 | - name: Run cargo-tarpaulin 20 | uses: actions-rs/tarpaulin@v0.1 21 | 22 | - name: Upload to codecov.io 23 | uses: codecov/codecov-action@v3 24 | -------------------------------------------------------------------------------- /.github/workflows/prepare-release.yml: -------------------------------------------------------------------------------- 1 | name: Prepare Release PR 2 | 3 | on: 4 | push: 5 | branches: 6 | - 'release-*' 7 | 8 | jobs: 9 | prepare-release: 10 | uses: mgeisler/rust-release-gh-action/.github/workflows/prepare-release.yml@main 11 | with: 12 | name: "Martin Geisler" 13 | email: "martin@geisler.net" 14 | changelog-file: "README.md" 15 | changelog-heading-level: "###" 16 | -------------------------------------------------------------------------------- /.github/workflows/publish-crate.yml: -------------------------------------------------------------------------------- 1 | name: Publish Crate 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | paths: 8 | - Cargo.toml 9 | 10 | jobs: 11 | publish: 12 | uses: mgeisler/rust-release-gh-action/.github/workflows/publish-crate.yml@main 13 | secrets: 14 | CARGO_TOKEN: ${{ secrets.CARGO_TOKEN }} 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | Cargo.lock 3 | *~ 4 | *.orig 5 | *.rej 6 | *.bak 7 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "lipsum" 3 | version = "0.9.1" 4 | authors = ["Martin Geisler "] 5 | description = """ 6 | Lipsum is a lorem ipsum text generation library. It generates 7 | pseudo-random Latin text. Use this if you need filler or dummy text 8 | for your application. 9 | 10 | The text is generated using a simple Markov chain, which you can 11 | instantiate to generate your own pieces of pseudo-random text. 12 | """ 13 | documentation = "https://docs.rs/lipsum/" 14 | repository = "https://github.com/mgeisler/lipsum/" 15 | readme = "README.md" 16 | keywords = ["random", "text", "markov", "typography"] 17 | categories = ["text-processing"] 18 | license = "MIT" 19 | edition = "2021" 20 | rust-version = "1.61" 21 | 22 | [dependencies] 23 | rand = {version = "0.8.5", default-features = false, features = ["alloc"]} 24 | rand_chacha = "0.3.1" 25 | 26 | [dev-dependencies] 27 | version-sync = "0.9.4" 28 | rand = "0.8.5" 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Martin Geisler 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Lorem Ipsum 2 | 3 | [![](https://github.com/mgeisler/lipsum/actions/workflows/build.yml/badge.svg)][build-status] 4 | [![](https://codecov.io/gh/mgeisler/lipsum/branch/master/graph/badge.svg)][codecov] 5 | [![](https://img.shields.io/crates/v/lipsum.svg)][crates-io] 6 | [![](https://docs.rs/lipsum/badge.svg)][api-docs] 7 | 8 | Lipsum is a small Rust library for generating pseudo-Latin [lorem 9 | ipsum filler text][lorem ipsum]. This is a standard placeholder text 10 | used in publishing. It starts with: 11 | 12 | > Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do 13 | > eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim 14 | > ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut 15 | > aliquip ex ea commodo consequat… 16 | 17 | The text is generated using a [Markov chain] that has been trained on 18 | the first book in Cicero's work _De finibus bonorum et malorum_ (_On 19 | the ends of good and evil_), of which the lorem ipsum text is a 20 | scrambled subset. 21 | 22 | ## Usage 23 | 24 | Add this to your `Cargo.toml`: 25 | 26 | ```toml 27 | [dependencies] 28 | lipsum = "0.9" 29 | ``` 30 | 31 | ## Documentation 32 | 33 | Please see the **[API documentation][api-docs]**. 34 | 35 | ## Getting Started 36 | 37 | Use the `lipsum` function to generate lorem ipsum text: 38 | 39 | ```rust 40 | use lipsum::lipsum; 41 | 42 | fn main() { 43 | // Print 25 random words of lorem ipsum text. 44 | println!("{}", lipsum(25)); 45 | } 46 | ``` 47 | 48 | This generates the lorem ipsum text show above: 49 | 50 | > Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do 51 | > eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim 52 | > ad minim veniam, quis nostrud exercitation ullamco… 53 | 54 | The text becomes random after 18 words, so you might not see exactly 55 | the same text. 56 | 57 | Use `lipsum_title` instead if you just need a short text suitable for 58 | a document title or a section heading. The text generated by that 59 | function looks like this: 60 | 61 | > Refugiendi et Omnino Rerum 62 | 63 | Small words are kept uncapitalized and punctuation is stripped from 64 | all words. 65 | 66 | ## Release History 67 | 68 | This is a changelog with the most important changes in each release. 69 | 70 | ### Version 0.9.1 (2024-03-13) 71 | 72 | * [#100](https://github.com/mgeisler/lipsum/pull/100): Add 73 | `lipsum_title_with_rng` function. 74 | * [#102](https://github.com/mgeisler/lipsum/pull/102): Document MSRV in 75 | `Cargo.toml`. 76 | * [#103](https://github.com/mgeisler/lipsum/pull/103): Enable dependabot 77 | updates. 78 | 79 | ### Version 0.9.0 (2023-03-28) 80 | 81 | * [#90](https://github.com/mgeisler/lipsum/pull/90): Test minimum 82 | supported Rust version (Rust 1.56) in CI 83 | * [#91](https://github.com/mgeisler/lipsum/pull/91): Remove dependency 84 | on system randomness 85 | 86 | ### Version 0.8.2 (2022-06-06) 87 | 88 | * [#84](https://github.com/mgeisler/lipsum/pull/84): Fix build error 89 | on Rust 1.56. Thanks @WorldSEnder for the report. 90 | 91 | ### Version 0.8.1 (2022-04-19) 92 | 93 | * [#73](https://github.com/mgeisler/lipsum/pull/73): Add 94 | `lipsum_from_seed` and tweak capitalization. Thanks @reknih! 95 | * [#77](https://github.com/mgeisler/lipsum/pull/77): Update to Rust 96 | 2021 edition. 97 | 98 | ### Version 0.8.0 (2021-05-30) 99 | 100 | The random number generator has been separated from the `MarkovChain` 101 | implementation to allow using the same trained model to generate 102 | multiple outputs with different seeds. Thanks @Diggsey! 103 | 104 | ### Version 0.7.0 (2020-07-08) 105 | 106 | - The code has been updated to the [Rust 2018 edition][rust-2018]. 107 | 108 | - Each new release will only support the latest stable version of 109 | Rust. Trying to support older Rust versions has proven to be a 110 | fool's errand: our dependencies keep releasing new patch versions 111 | that require newer and newer versions of Rust. 112 | 113 | - [#65](https://github.com/mgeisler/lipsum/pull/65): A new 114 | `lipsum_words_from_seed` function was added. It generates random but 115 | deterministic lorem ipsum text. This is useful in unit tests when 116 | you need fixed inputs. 117 | 118 | ### Version 0.6.0 (2018-12-09) 119 | 120 | The new `lipsum_words` function can be used to generate random lorem 121 | ipsum text that doesn't always start with "Lorem ipsum". 122 | 123 | Dependencies were updated and the oldest supported version of Rust is 124 | now 1.22. 125 | 126 | ### Version 0.5.0 (2018-04-22) 127 | 128 | The new `lipsum_title` function can be used to generate a short string 129 | suitable for a document title or a section heading. 130 | 131 | Dependencies were updated and the oldest supported version of Rust is 132 | now 1.17. 133 | 134 | ### Version 0.4.0 (2017-09-24) 135 | 136 | The `generate` and `generate_from` now always generate proper 137 | sentences, meaning that they generate sentences that start with a 138 | capital letter and end with `.` or some other punctuation character. 139 | Use `iter` and `iter_from` directly if you need more control. 140 | 141 | ### Version 0.3.0 (2017-07-28) 142 | 143 | Performance is improved by about 50% when generating text, but 144 | training the Markov chain now takes about twice as long as before. 145 | 146 | The `MarkovChain` struct has many new methods: 147 | 148 | - `new_with_rng` makes it possible to specify the random number 149 | generator used by the Markov chain. Use this to get deterministic 150 | and thus reproducible output for tests. `MarkovChain` now owns the 151 | RNG it uses and as a consequence, it has an extra type parameter. 152 | This is a breaking change if you used struct directly in your code. 153 | 154 | - `iter` and `into_from` return iterators over words in the Markov 155 | chain. The `generate` and `generate_from` methods are now 156 | straight-forward convenience wrappers for the iterators. 157 | 158 | - `len` tells you the number of stats in the Markov chain and 159 | `is_empty` tells you if the Markov chain is empty, meaning that it 160 | hasn't been trained on anything yet. 161 | 162 | ### Version 0.2.0 (2017-07-10) 163 | 164 | Rust version 1.6.0 is now supported. This is checked with TravisCI. 165 | 166 | ### Version 0.1.0 (2017-07-2) 167 | 168 | First public release. 169 | 170 | ## License 171 | 172 | Lipsum can be distributed according to the [MIT license][mit]. 173 | Contributions will be accepted under the same license. 174 | 175 | [build-status]: https://github.com/mgeisler/lipsum/actions/workflows/build.yml 176 | [codecov]: https://codecov.io/gh/mgeisler/lipsum 177 | [crates-io]: https://crates.io/crates/lipsum 178 | [api-docs]: https://docs.rs/lipsum/ 179 | [lorem ipsum]: https://en.wikipedia.org/wiki/Lorem_ipsum 180 | [markov chain]: https://en.wikipedia.org/wiki/Markov_chain 181 | [rust-2018]: https://doc.rust-lang.org/edition-guide/rust-2018/ 182 | [mit]: LICENSE 183 | -------------------------------------------------------------------------------- /benches/generate.rs: -------------------------------------------------------------------------------- 1 | #![feature(test)] 2 | 3 | extern crate test; 4 | use test::Bencher; 5 | 6 | #[bench] 7 | fn generate_lorem_ipsum_100(b: &mut Bencher) { 8 | b.iter(|| lipsum::lipsum(100)) 9 | } 10 | 11 | #[bench] 12 | fn generate_lorem_ipsum_200(b: &mut Bencher) { 13 | b.iter(|| lipsum::lipsum(200)) 14 | } 15 | -------------------------------------------------------------------------------- /benches/learn.rs: -------------------------------------------------------------------------------- 1 | #![feature(test)] 2 | 3 | extern crate test; 4 | use test::Bencher; 5 | 6 | #[bench] 7 | fn learn_lorem_ipsum(b: &mut Bencher) { 8 | b.iter(|| { 9 | let mut chain = lipsum::MarkovChain::new(); 10 | chain.learn(lipsum::LOREM_IPSUM) 11 | }) 12 | } 13 | 14 | #[bench] 15 | fn learn_liber_primus(b: &mut Bencher) { 16 | b.iter(|| { 17 | let mut chain = lipsum::MarkovChain::new(); 18 | chain.learn(lipsum::LIBER_PRIMUS) 19 | }) 20 | } 21 | -------------------------------------------------------------------------------- /examples/lipsum.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | // Generate lorem ipsum text with Title Case. 3 | let title = lipsum::lipsum_title(); 4 | // Print underlined title and lorem ipsum text. 5 | println!("{}\n{}\n", title, str::repeat("=", title.len())); 6 | 7 | // First command line argument or "" if not supplied. 8 | let arg = std::env::args().nth(1).unwrap_or_default(); 9 | // Number of words to generate. 10 | let n = arg.parse().unwrap_or(25); 11 | // Print n words of lorem ipsum text. 12 | println!("{}", lipsum::lipsum(n)); 13 | } 14 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | //! Lorem ipsum generator. 2 | //! 3 | //! This crate generates pseudo-Latin [lorem ipsum placeholder 4 | //! text][wiki]. The traditional lorem ipsum text start like this: 5 | //! 6 | //! > Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do 7 | //! > eiusmod tempor incididunt ut labore et dolore magna aliqua. 8 | //! 9 | //! This text is in the [`LOREM_IPSUM`] constant. Random looking text 10 | //! like the above can be generated using the [`lipsum`] function. The 11 | //! function allows you to generate as much text as desired and each 12 | //! invocation will generate different text. 13 | //! 14 | //! The random looking text is generated using a [Markov chain] of 15 | //! order two, which simply means that the next word is based on the 16 | //! previous two words in the input texts. The Markov chain can be 17 | //! used with other input texts by creating an instance of 18 | //! [`MarkovChain`] and calling its [`learn`] method. 19 | //! 20 | //! [wiki]: https://en.wikipedia.org/wiki/Lorem_ipsum 21 | //! [`lipsum`]: fn.lipsum.html 22 | //! [`MarkovChain`]: struct.MarkovChain.html 23 | //! [`learn`]: struct.MarkovChain.html#method.learn 24 | //! [Markov chain]: https://en.wikipedia.org/wiki/Markov_chain 25 | 26 | #![doc(html_root_url = "https://docs.rs/lipsum/0.9.1")] 27 | #![forbid(unsafe_code)] 28 | #![deny(missing_docs)] 29 | 30 | use rand::seq::SliceRandom; 31 | use rand::{Rng, SeedableRng}; 32 | use rand_chacha::ChaCha20Rng; 33 | use std::collections::HashMap; 34 | 35 | /// A bigram is simply two consecutive words. 36 | pub type Bigram<'a> = (&'a str, &'a str); 37 | 38 | /// Simple order two Markov chain implementation. 39 | /// 40 | /// The [Markov chain] is a chain of order two, which means that it 41 | /// will use the previous two words (a bigram) when predicting the 42 | /// next word. This is normally enough to generate random text that 43 | /// looks somewhat plausible. The implementation is based on 44 | /// [Generating arbitrary text with Markov chains in Rust][blog post]. 45 | /// 46 | /// [Markov chain]: https://en.wikipedia.org/wiki/Markov_chain 47 | /// [blog post]: https://blakewilliams.me/posts/generating-arbitrary-text-with-markov-chains-in-rust 48 | #[derive(Debug, Clone, Default)] 49 | pub struct MarkovChain<'a> { 50 | map: HashMap, Vec<&'a str>>, 51 | keys: Vec>, 52 | } 53 | 54 | impl<'a> MarkovChain<'a> { 55 | /// Create a new empty Markov chain. 56 | /// 57 | /// # Examples 58 | /// 59 | /// ``` 60 | /// # fn main() { 61 | /// use lipsum::MarkovChain; 62 | /// use rand::SeedableRng; 63 | /// use rand_chacha::ChaCha20Rng; 64 | /// 65 | /// let mut chain = MarkovChain::new(); 66 | /// chain.learn("infra-red red orange yellow green blue indigo x-ray"); 67 | /// 68 | /// let mut rng = ChaCha20Rng::seed_from_u64(0); 69 | /// 70 | /// // The chain jumps consistently like this: 71 | /// assert_eq!(chain.generate_with_rng(&mut rng, 1), "Orange."); 72 | /// assert_eq!(chain.generate_with_rng(&mut rng, 1), "Infra-red."); 73 | /// assert_eq!(chain.generate_with_rng(&mut rng, 1), "Yellow."); 74 | /// # } 75 | /// ``` 76 | pub fn new() -> MarkovChain<'a> { 77 | Default::default() 78 | } 79 | 80 | /// Add new text to the Markov chain. This can be called several 81 | /// times to build up the chain. 82 | /// 83 | /// # Examples 84 | /// 85 | /// ``` 86 | /// use lipsum::MarkovChain; 87 | /// 88 | /// let mut chain = MarkovChain::new(); 89 | /// chain.learn("red green blue"); 90 | /// assert_eq!(chain.words(("red", "green")), Some(&vec!["blue"])); 91 | /// 92 | /// chain.learn("red green yellow"); 93 | /// assert_eq!(chain.words(("red", "green")), Some(&vec!["blue", "yellow"])); 94 | /// ``` 95 | pub fn learn(&mut self, sentence: &'a str) { 96 | let words = sentence.split_whitespace().collect::>(); 97 | for window in words.windows(3) { 98 | let (a, b, c) = (window[0], window[1], window[2]); 99 | self.map.entry((a, b)).or_default().push(c); 100 | } 101 | // Sync the keys with the current map. 102 | self.keys = self.map.keys().cloned().collect(); 103 | self.keys.sort_unstable(); 104 | } 105 | 106 | /// Returs the number of states in the Markov chain. 107 | /// 108 | /// # Examples 109 | /// 110 | /// ``` 111 | /// use lipsum::MarkovChain; 112 | /// 113 | /// let mut chain = MarkovChain::new(); 114 | /// assert_eq!(chain.len(), 0); 115 | /// 116 | /// chain.learn("red orange yellow green blue indigo"); 117 | /// assert_eq!(chain.len(), 4); 118 | /// ``` 119 | #[inline] 120 | pub fn len(&self) -> usize { 121 | self.map.len() 122 | } 123 | 124 | /// Returns `true` if the Markov chain has no states. 125 | /// 126 | /// # Examples 127 | /// 128 | /// ``` 129 | /// use lipsum::MarkovChain; 130 | /// 131 | /// let mut chain = MarkovChain::new(); 132 | /// assert!(chain.is_empty()); 133 | /// 134 | /// chain.learn("foo bar baz"); 135 | /// assert!(!chain.is_empty()); 136 | /// ``` 137 | pub fn is_empty(&self) -> bool { 138 | self.len() == 0 139 | } 140 | 141 | /// Get the possible words following the given bigram, or `None` 142 | /// if the state is invalid. 143 | /// 144 | /// # Examples 145 | /// 146 | /// ``` 147 | /// use lipsum::MarkovChain; 148 | /// 149 | /// let mut chain = MarkovChain::new(); 150 | /// chain.learn("red green blue"); 151 | /// assert_eq!(chain.words(("red", "green")), Some(&vec!["blue"])); 152 | /// assert_eq!(chain.words(("foo", "bar")), None); 153 | /// ``` 154 | pub fn words(&self, state: Bigram<'a>) -> Option<&Vec<&str>> { 155 | self.map.get(&state) 156 | } 157 | 158 | /// Generate a sentence with `n` words of lorem ipsum text. The 159 | /// sentence will start from a random point in the Markov chain 160 | /// generated using the specified random number generator, 161 | /// and a `.` will be added as necessary to form a full sentence. 162 | /// 163 | /// See [`generate_with_rng_from`] if you want to control the 164 | /// starting point for the generated text and see [`iter_with_rng`] 165 | /// if you simply want a sequence of words. 166 | /// 167 | /// # Examples 168 | /// 169 | /// Generating the sounds of a grandfather clock: 170 | /// 171 | /// ``` 172 | /// use lipsum::MarkovChain; 173 | /// use rand_chacha::ChaCha20Rng; 174 | /// use rand::SeedableRng; 175 | /// 176 | /// let mut chain = MarkovChain::new(); 177 | /// chain.learn("Tick, Tock, Tick, Tock, Ding! Tick, Tock, Ding! Ding!"); 178 | /// println!("{}", chain.generate_with_rng(ChaCha20Rng::seed_from_u64(0), 15)); 179 | /// ``` 180 | /// 181 | /// The output looks like this: 182 | /// 183 | /// > Ding! Tick, Tock, Tick, Tock, Ding! Ding! Tock, Ding! Tick, 184 | /// > Tock, Tick, Tock, Tick, Tock. 185 | /// 186 | /// [`generate_with_rng_from`]: struct.MarkovChain.html#method.generate_with_rng_from 187 | /// [`iter_with_rng`]: struct.MarkovChain.html#method.iter_with_rng 188 | pub fn generate_with_rng(&self, rng: R, n: usize) -> String { 189 | join_words(self.iter_with_rng(rng).take(n)) 190 | } 191 | 192 | /// Generate a sentence with `n` words of lorem ipsum text. The sentence 193 | /// will start from a predetermined point in the Markov chain generated 194 | /// using the default random number generator and a `.` will be added as 195 | /// necessary to form a full sentence. 196 | /// 197 | /// See [`generate_from`] if you want to control the starting point for the 198 | /// generated text and see [`iter`] if you simply want a sequence of words. 199 | /// 200 | /// # Examples 201 | /// 202 | /// Generating the sounds of a grandfather clock: 203 | /// 204 | /// ``` 205 | /// use lipsum::MarkovChain; 206 | /// 207 | /// let mut chain = MarkovChain::new(); 208 | /// chain.learn("Tick, Tock, Tick, Tock, Ding! Tick, Tock, Ding! Ding!"); 209 | /// println!("{}", chain.generate(15)); 210 | /// ``` 211 | /// 212 | /// The output looks like this: 213 | /// 214 | /// > Ding! Tick, Tock, Tick, Tock, Ding! Ding! Tock, Ding! Tick, 215 | /// > Tock, Tick, Tock, Tick, Tock. 216 | /// 217 | /// [`generate_from`]: struct.MarkovChain.html#method.generate_from 218 | /// [`iter`]: struct.MarkovChain.html#method.iter 219 | pub fn generate(&self, n: usize) -> String { 220 | self.generate_with_rng(default_rng(), n) 221 | } 222 | 223 | /// Generate a sentence with `n` words of lorem ipsum text. The 224 | /// sentence will start from the given bigram and a `.` will be 225 | /// added as necessary to form a full sentence. 226 | /// 227 | /// Use [`generate_with_rng`] if the starting point is not important. See 228 | /// [`iter_with_rng_from`] if you want a sequence of words that you can 229 | /// format yourself. 230 | /// 231 | /// [`generate_with_rng`]: struct.MarkovChain.html#method.generate_with_rng 232 | /// [`iter_with_rng_from`]: struct.MarkovChain.html#method.iter_with_rng_from 233 | pub fn generate_with_rng_from(&self, rng: R, n: usize, from: Bigram<'a>) -> String { 234 | join_words(self.iter_with_rng_from(rng, from).take(n)) 235 | } 236 | 237 | /// Generate a sentence with `n` words of lorem ipsum text. The 238 | /// sentence will start from the given bigram and a `.` will be 239 | /// added as necessary to form a full sentence. 240 | /// 241 | /// Use [`generate`] if the starting point is not important. See 242 | /// [`iter_from`] if you want a sequence of words that you can 243 | /// format yourself. 244 | /// 245 | /// [`generate`]: struct.MarkovChain.html#method.generate 246 | /// [`iter_from`]: struct.MarkovChain.html#method.iter_from 247 | pub fn generate_from(&self, n: usize, from: Bigram<'a>) -> String { 248 | self.generate_with_rng_from(default_rng(), n, from) 249 | } 250 | 251 | /// Make a never-ending iterator over the words in the Markov 252 | /// chain. The iterator starts at a random point in the chain. 253 | pub fn iter_with_rng(&self, mut rng: R) -> Words<'_, R> { 254 | let initial_bigram = if self.is_empty() { 255 | ("", "") 256 | } else { 257 | *self.keys.choose(&mut rng).unwrap() 258 | }; 259 | self.iter_with_rng_from(rng, initial_bigram) 260 | } 261 | 262 | /// Make a never-ending iterator over the words in the Markov chain. The 263 | /// iterator starts at a predetermined point in the chain. 264 | pub fn iter(&self) -> Words<'_, impl Rng> { 265 | self.iter_with_rng(default_rng()) 266 | } 267 | 268 | /// Make a never-ending iterator over the words in the Markov 269 | /// chain. The iterator starts at the given bigram. 270 | pub fn iter_with_rng_from(&self, rng: R, from: Bigram<'a>) -> Words<'_, R> { 271 | Words { 272 | map: &self.map, 273 | rng, 274 | keys: &self.keys, 275 | state: from, 276 | } 277 | } 278 | 279 | /// Make a never-ending iterator over the words in the Markov 280 | /// chain. The iterator starts at the given bigram. 281 | pub fn iter_from(&self, from: Bigram<'a>) -> Words<'_, impl Rng> { 282 | self.iter_with_rng_from(default_rng(), from) 283 | } 284 | } 285 | 286 | /// Provide a default random number generator. This generator is seeded and will 287 | /// always produce the same sequence of numbers. The seed is chosen to yield 288 | /// good results for the included Markov chain. 289 | fn default_rng() -> impl Rng { 290 | ChaCha20Rng::seed_from_u64(97) 291 | } 292 | 293 | /// Never-ending iterator over words in the Markov chain. 294 | /// 295 | /// Generated with the [`iter`] or [`iter_from`] methods. 296 | /// 297 | /// [`iter`]: struct.MarkovChain.html#method.iter 298 | /// [`iter_from`]: struct.MarkovChain.html#method.iter_from 299 | pub struct Words<'a, R: Rng> { 300 | map: &'a HashMap, Vec<&'a str>>, 301 | rng: R, 302 | keys: &'a Vec>, 303 | state: Bigram<'a>, 304 | } 305 | 306 | impl<'a, R: Rng> Iterator for Words<'a, R> { 307 | type Item = &'a str; 308 | 309 | fn next(&mut self) -> Option<&'a str> { 310 | if self.map.is_empty() { 311 | return None; 312 | } 313 | 314 | let result = Some(self.state.0); 315 | 316 | while !self.map.contains_key(&self.state) { 317 | self.state = *self.keys.choose(&mut self.rng).unwrap(); 318 | } 319 | let next_words = &self.map[&self.state]; 320 | let next = next_words.choose(&mut self.rng).unwrap(); 321 | self.state = (self.state.1, next); 322 | result 323 | } 324 | } 325 | 326 | /// Check if `c` is an ASCII punctuation character. 327 | fn is_ascii_punctuation(c: char) -> bool { 328 | c.is_ascii_punctuation() 329 | } 330 | 331 | /// Capitalize the first character in a string. 332 | fn capitalize(word: &str) -> String { 333 | let idx = match word.chars().next() { 334 | Some(c) => c.len_utf8(), 335 | None => 0, 336 | }; 337 | 338 | let mut result = String::with_capacity(word.len()); 339 | result.push_str(&word[..idx].to_uppercase()); 340 | result.push_str(&word[idx..]); 341 | result 342 | } 343 | 344 | /// Join words from an iterator. The first word is always capitalized 345 | /// and the generated sentence will end with `'.'` if it doesn't 346 | /// already end with some other ASCII punctuation character. 347 | fn join_words<'a, I: Iterator>(mut words: I) -> String { 348 | match words.next() { 349 | None => String::new(), 350 | Some(word) => { 351 | // Punctuation characters which ends a sentence. 352 | let punctuation: &[char] = &['.', '!', '?']; 353 | 354 | let mut sentence = capitalize(word); 355 | let mut needs_cap = sentence.ends_with(punctuation); 356 | 357 | // Add remaining words. 358 | for word in words { 359 | sentence.push(' '); 360 | 361 | if needs_cap { 362 | sentence.push_str(&capitalize(word)); 363 | } else { 364 | sentence.push_str(word); 365 | } 366 | 367 | needs_cap = word.ends_with(punctuation); 368 | } 369 | 370 | // Ensure the sentence ends with either one of ".!?". 371 | if !sentence.ends_with(punctuation) { 372 | // Trim all trailing punctuation characters to avoid 373 | // adding '.' after a ',' or similar. 374 | let idx = sentence.trim_end_matches(is_ascii_punctuation).len(); 375 | sentence.truncate(idx); 376 | sentence.push('.'); 377 | } 378 | 379 | sentence 380 | } 381 | } 382 | } 383 | 384 | /// The traditional lorem ipsum text as given in [Wikipedia]. Using 385 | /// this text alone for a Markov chain of order two doesn't work very 386 | /// well since each bigram (two consequtive words) is followed by just 387 | /// one other word. In other words, the Markov chain will always 388 | /// produce the same output and recreate the lorem ipsum text 389 | /// precisely. However, combining it with the full text in 390 | /// [`LIBER_PRIMUS`] works well. 391 | /// 392 | /// [Wikipedia]: https://en.wikipedia.org/wiki/Lorem_ipsum 393 | /// [`LIBER_PRIMUS`]: constant.LIBER_PRIMUS.html 394 | pub const LOREM_IPSUM: &str = include_str!("lorem-ipsum.txt"); 395 | 396 | /// The first book in Cicero's work De finibus bonorum et malorum ("On 397 | /// the ends of good and evil"). The lorem ipsum text in 398 | /// [`LOREM_IPSUM`] is derived from part of this text. 399 | /// 400 | /// [`LOREM_IPSUM`]: constant.LOREM_IPSUM.html 401 | pub const LIBER_PRIMUS: &str = include_str!("liber-primus.txt"); 402 | 403 | thread_local! { 404 | // Markov chain generating lorem ipsum text. 405 | static LOREM_IPSUM_CHAIN: MarkovChain<'static> = { 406 | let mut chain = MarkovChain::new(); 407 | // The cost of learning increases as more and more text is 408 | // added, so we start with the smallest text. 409 | chain.learn(LOREM_IPSUM); 410 | chain.learn(LIBER_PRIMUS); 411 | chain 412 | } 413 | } 414 | 415 | /// Generate `n` words of lorem ipsum text. The output will always start with 416 | /// "Lorem ipsum". 417 | /// 418 | /// The text continues with the standard lorem ipsum text from [`LOREM_IPSUM`] 419 | /// and becomes randomly generated but deterministic if more than 18 words is 420 | /// requested. See [`lipsum_words`] if fully random text is needed. 421 | /// 422 | /// # Examples 423 | /// 424 | /// ``` 425 | /// use lipsum::lipsum; 426 | /// 427 | /// assert_eq!(lipsum(7), "Lorem ipsum dolor sit amet, consectetur adipiscing."); 428 | /// ``` 429 | /// 430 | /// [`LOREM_IPSUM`]: constant.LOREM_IPSUM.html 431 | /// [`lipsum_words`]: fn.lipsum_words.html 432 | pub fn lipsum(n: usize) -> String { 433 | LOREM_IPSUM_CHAIN.with(|chain| chain.generate_from(n, ("Lorem", "ipsum"))) 434 | } 435 | 436 | /// Generate `n` words of lorem ipsum text with a custom RNG. The output will 437 | /// always start with "Lorem ipsum". 438 | /// 439 | /// A custom RNG allows to base the markov chain on a different random number 440 | /// sequence. This also allows using a regular [`thread_rng`] random number 441 | /// generator. If that generator is used, the text will differ in each 442 | /// invocation. 443 | /// 444 | /// # Examples 445 | /// 446 | /// ``` 447 | /// use lipsum::lipsum_with_rng; 448 | /// use rand::thread_rng; 449 | /// 450 | /// println!("{}", lipsum_with_rng(thread_rng(), 23)); 451 | /// // -> "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do 452 | /// // eiusmod tempor incididunt ut labore et dolore magnam aliquam 453 | /// // quaerat voluptatem. Ut enim." 454 | /// ``` 455 | /// 456 | /// [`thread_rng`]: https://docs.rs/rand/latest/rand/fn.thread_rng.html 457 | pub fn lipsum_with_rng(rng: impl Rng, n: usize) -> String { 458 | LOREM_IPSUM_CHAIN.with(|chain| chain.generate_with_rng_from(rng, n, ("Lorem", "ipsum"))) 459 | } 460 | 461 | /// Generate `n` words of lorem ipsum text. 462 | /// 463 | /// The text is deterministically sampled from a Markov chain based on 464 | /// [`LOREM_IPSUM`]. Multiple sentences may be generated, depending on the 465 | /// punctuation of the words being selected. 466 | /// 467 | /// # Examples 468 | /// 469 | /// ``` 470 | /// use lipsum::lipsum_words; 471 | /// 472 | /// assert_eq!(lipsum_words(6), "Ullus investigandi veri, nisi inveneris, et."); 473 | /// ``` 474 | /// 475 | /// [`LOREM_IPSUM`]: constant.LOREM_IPSUM.html 476 | pub fn lipsum_words(n: usize) -> String { 477 | LOREM_IPSUM_CHAIN.with(|chain| chain.generate(n)) 478 | } 479 | 480 | /// Generate `n` words of lorem ipsum text with a custom RNG. 481 | /// 482 | /// A custom RNG allows to base the markov chain on a different random number 483 | /// sequence. This also allows using a regular [`thread_rng`] random number 484 | /// generator. If that generator is used, the text will differ in each 485 | /// invocation. 486 | /// 487 | /// # Examples 488 | /// 489 | /// ``` 490 | /// use lipsum::lipsum_words_with_rng; 491 | /// use rand::thread_rng; 492 | /// 493 | /// println!("{}", lipsum_words_with_rng(thread_rng(), 7)); 494 | /// // -> "Quot homines, tot sententiae; falli igitur possumus." 495 | /// ``` 496 | /// 497 | /// [`thread_rng`]: https://docs.rs/rand/latest/rand/fn.thread_rng.html 498 | pub fn lipsum_words_with_rng(rng: impl Rng, n: usize) -> String { 499 | LOREM_IPSUM_CHAIN.with(|chain| chain.generate_with_rng(rng, n)) 500 | } 501 | 502 | /// Minimum number of words to include in a title. 503 | const TITLE_MIN_WORDS: usize = 3; 504 | /// Maximum number of words to include in a title. 505 | const TITLE_MAX_WORDS: usize = 8; 506 | /// Words shorter than this size are not capitalized. 507 | const TITLE_SMALL_WORD: usize = 3; 508 | 509 | /// Generate a short lorem ipsum text with words in title case. 510 | /// 511 | /// The words are capitalized and stripped for punctuation characters. 512 | /// 513 | /// # Examples 514 | /// 515 | /// ``` 516 | /// use lipsum::lipsum_title; 517 | /// 518 | /// println!("{}", lipsum_title()); 519 | /// ``` 520 | /// 521 | /// This will generate a string like 522 | /// 523 | /// > Grate Meminit et Praesentibus 524 | /// 525 | /// which should be suitable for use in a document title for section 526 | /// heading. 527 | pub fn lipsum_title() -> String { 528 | lipsum_title_with_rng(default_rng()) 529 | } 530 | 531 | /// Generate a short lorem ipsum text with words in title case with a custom RNG. 532 | /// 533 | /// A custom RNG allows to base the markov chain on a different random number 534 | /// sequence. This also allows using a regular [`thread_rng`] random number 535 | /// generator. If that generator is used, the text will differ in each 536 | /// invocation. 537 | /// 538 | /// The words are capitalized and stripped for punctuation characters. 539 | /// 540 | /// # Examples 541 | /// 542 | /// ``` 543 | /// use lipsum::lipsum_title_with_rng; 544 | /// use rand::thread_rng; 545 | /// 546 | /// println!("{}", lipsum_title_with_rng(thread_rng())); 547 | /// ``` 548 | /// 549 | /// This will generate a string like 550 | /// 551 | /// > Grate Meminit et Praesentibus 552 | /// 553 | /// which should be suitable for use in a document title for section 554 | /// heading. 555 | /// 556 | /// [`thread_rng`]: https://docs.rs/rand/latest/rand/fn.thread_rng.html 557 | pub fn lipsum_title_with_rng(mut rng: impl Rng) -> String { 558 | LOREM_IPSUM_CHAIN.with(|chain| { 559 | let n = rng.gen_range(TITLE_MIN_WORDS..TITLE_MAX_WORDS); 560 | // The average word length with our corpus is 7.6 bytes so 561 | // this capacity will avoid most allocations. 562 | let mut title = String::with_capacity(8 * n); 563 | 564 | let words = chain 565 | .iter_with_rng(rng) 566 | .map(|word| word.trim_matches(is_ascii_punctuation)) 567 | .filter(|word| !word.is_empty()) 568 | .take(n); 569 | 570 | for (i, word) in words.enumerate() { 571 | if i > 0 { 572 | title.push(' '); 573 | } 574 | 575 | // Capitalize the first word and all long words. 576 | if i == 0 || word.len() > TITLE_SMALL_WORD { 577 | title.push_str(&capitalize(word)); 578 | } else { 579 | title.push_str(word); 580 | } 581 | } 582 | title 583 | }) 584 | } 585 | 586 | #[cfg(test)] 587 | mod tests { 588 | use super::*; 589 | use rand::thread_rng; 590 | 591 | #[test] 592 | fn starts_with_lorem_ipsum() { 593 | assert_eq!(&lipsum(10)[..11], "Lorem ipsum"); 594 | } 595 | 596 | #[test] 597 | fn generate_zero_words() { 598 | assert_eq!(lipsum(0).split_whitespace().count(), 0); 599 | } 600 | 601 | #[test] 602 | fn generate_one_word() { 603 | assert_eq!(lipsum(1).split_whitespace().count(), 1); 604 | } 605 | 606 | #[test] 607 | fn generate_two_words() { 608 | assert_eq!(lipsum(2).split_whitespace().count(), 2); 609 | } 610 | 611 | #[test] 612 | fn starts_differently() { 613 | // Check that calls to lipsum_words don't always start with 614 | // "Lorem ipsum". 615 | let idx = "Lorem ipsum".len(); 616 | assert_ne!( 617 | &lipsum_words_with_rng(thread_rng(), 5)[..idx], 618 | &lipsum_words_with_rng(thread_rng(), 5)[..idx] 619 | ); 620 | } 621 | 622 | #[test] 623 | fn generate_title() { 624 | for word in lipsum_title().split_whitespace() { 625 | assert!( 626 | !word.starts_with(is_ascii_punctuation) && !word.ends_with(is_ascii_punctuation), 627 | "Unexpected punctuation: {:?}", 628 | word 629 | ); 630 | if word.len() > TITLE_SMALL_WORD { 631 | assert!( 632 | word.starts_with(char::is_uppercase), 633 | "Expected small word to be capitalized: {:?}", 634 | word 635 | ); 636 | } 637 | } 638 | } 639 | 640 | #[test] 641 | fn capitalize_after_punctiation() { 642 | // The Markov Chain will yield a "habitut." as the second word. However, 643 | // the following "voluptatem" is not capitalized, which does not make 644 | // much sense, given that it appears after a full stop. The `join_words` 645 | // must ensure that every word appearing after sentence-ending 646 | // punctuation is capitalized. 647 | assert_eq!( 648 | lipsum_words_with_rng(ChaCha20Rng::seed_from_u64(5), 9), 649 | "Nullam habuit. Voluptatem cum summum bonum in voluptate est." 650 | ); 651 | } 652 | 653 | #[test] 654 | fn empty_chain() { 655 | let chain = MarkovChain::new(); 656 | assert_eq!(chain.generate(10), ""); 657 | } 658 | 659 | #[test] 660 | fn generate_from() { 661 | let mut chain = MarkovChain::new(); 662 | chain.learn("red orange yellow green blue indigo violet"); 663 | assert_eq!( 664 | chain.generate_from(5, ("orange", "yellow")), 665 | "Orange yellow green blue indigo." 666 | ); 667 | } 668 | 669 | #[test] 670 | fn generate_last_bigram() { 671 | // The bigram "yyy zzz" will not be present in the Markov 672 | // chain's map, and so we will not generate "xxx yyy zzz" as 673 | // one would expect. The chain moves from state "xxx yyy" to 674 | // "yyy zzz", but sees that as invalid state and resets itself 675 | // back to "xxx yyy". 676 | let mut chain = MarkovChain::new(); 677 | chain.learn("xxx yyy zzz"); 678 | assert_ne!(chain.generate_from(3, ("xxx", "yyy")), "xxx yyy zzz"); 679 | } 680 | 681 | #[test] 682 | fn generate_from_no_panic() { 683 | // No panic when asked to generate a chain from a starting 684 | // point that doesn't exist in the chain. 685 | let mut chain = MarkovChain::new(); 686 | chain.learn("foo bar baz"); 687 | chain.generate_from(3, ("xxx", "yyy")); 688 | } 689 | 690 | #[test] 691 | fn chain_map() { 692 | let mut chain = MarkovChain::new(); 693 | chain.learn("foo bar baz quuz"); 694 | let map = &chain.map; 695 | 696 | assert_eq!(map.len(), 2); 697 | assert_eq!(map[&("foo", "bar")], vec!["baz"]); 698 | assert_eq!(map[&("bar", "baz")], vec!["quuz"]); 699 | } 700 | 701 | #[test] 702 | fn new_with_rng() { 703 | let rng = ChaCha20Rng::seed_from_u64(1234); 704 | let mut chain = MarkovChain::new(); 705 | chain.learn("foo bar x y z"); 706 | chain.learn("foo bar a b c"); 707 | 708 | assert_eq!( 709 | chain.generate_with_rng(rng, 15), 710 | "A b bar a b a b bar a b x y b y x." 711 | ); 712 | } 713 | } 714 | -------------------------------------------------------------------------------- /src/liber-primus.txt: -------------------------------------------------------------------------------- 1 | Non eram nescius, Brute, cum, quae summis ingeniis exquisitaque 2 | doctrina philosophi Graeco sermone tractavissent, ea Latinis litteris 3 | mandaremus, fore ut hic noster labor in varias reprehensiones 4 | incurreret. nam quibusdam, et iis quidem non admodum indoctis, totum 5 | hoc displicet philosophari. quidam autem non tam id reprehendunt, si 6 | remissius agatur, sed tantum studium tamque multam operam ponendam in 7 | eo non arbitrantur. erunt etiam, et ii quidem eruditi Graecis 8 | litteris, contemnentes Latinas, qui se dicant in Graecis legendis 9 | operam malle consumere. postremo aliquos futuros suspicor, qui me ad 10 | alias litteras vocent, genus hoc scribendi, etsi sit elegans, personae 11 | tamen et dignitatis esse negent. 12 | 13 | Contra quos omnis dicendum breviter existimo. Quamquam philosophiae 14 | quidem vituperatoribus satis responsum est eo libro, quo a nobis 15 | philosophia defensa et collaudata est, cum esset accusata et 16 | vituperata ab Hortensio. qui liber cum et tibi probatus videretur et 17 | iis, quos ego posse iudicare arbitrarer, plura suscepi veritus ne 18 | movere hominum studia viderer, retinere non posse. Qui autem, si 19 | maxime hoc placeat, moderatius tamen id volunt fieri, difficilem 20 | quandam temperantiam postulant in eo, quod semel admissum coerceri 21 | reprimique non potest, ut propemodum iustioribus utamur illis, qui 22 | omnino avocent a philosophia, quam his, qui rebus infinitis modum 23 | constituant in reque eo meliore, quo maior sit, mediocritatem 24 | desiderent. 25 | 26 | Sive enim ad sapientiam perveniri potest, non paranda nobis solum ea, 27 | sed fruenda etiam sapientia est; sive hoc difficile est, tamen nec 28 | modus est ullus investigandi veri, nisi inveneris, et quaerendi 29 | defatigatio turpis est, cum id, quod quaeritur, sit pulcherrimum. 30 | etenim si delectamur, cum scribimus, quis est tam invidus, qui ab eo 31 | nos abducat? sin laboramus, quis est, qui alienae modum statuat 32 | industriae? nam ut Terentianus Chremes non inhumanus, qui novum 33 | vicinum non vult 'fodere aut arare aut aliquid ferre denique' -- non 34 | enim illum ab industria, sed ab inliberali labore deterret --, sic 35 | isti curiosi, quos offendit noster minime nobis iniucundus labor. 36 | 37 | Iis igitur est difficilius satis facere, qui se Latina scripta dicunt 38 | contemnere. in quibus hoc primum est in quo admirer, cur in 39 | gravissimis rebus non delectet eos sermo patrius, cum idem fabellas 40 | Latinas ad verbum e Graecis expressas non inviti legant. quis enim tam 41 | inimicus paene nomini Romano est, qui Ennii Medeam aut Antiopam 42 | Pacuvii spernat aut reiciat, quod se isdem Euripidis fabulis delectari 43 | dicat, Latinas litteras oderit? 44 | 45 | Synephebos ego, inquit, potius Caecilii aut Andriam Terentii quam 46 | utramque Menandri legam? 47 | 48 | A quibus tantum dissentio, ut, cum Sophocles vel optime scripserit 49 | Electram, tamen male conversam Atilii mihi legendam putem, de quo 50 | Lucilius: 'ferreum scriptorem', verum, opinor, scriptorem tamen, ut 51 | legendus sit. rudem enim esse omnino in nostris poetis aut 52 | inertissimae segnitiae est aut fastidii delicatissimi. mihi quidem 53 | nulli satis eruditi videntur, quibus nostra ignota sunt. an 'Utinam ne 54 | in nemore . . .' nihilo minus legimus quam hoc idem Graecum, quae 55 | autem de bene beateque vivendo a Platone disputata sunt, haec 56 | explicari non placebit Latine? 57 | 58 | Quid? si nos non interpretum fungimur munere, sed tuemur ea, quae 59 | dicta sunt ab iis quos probamus, eisque nostrum iudicium et nostrum 60 | scribendi ordinem adiungimus, quid habent, cur Graeca anteponant iis, 61 | quae et splendide dicta sint neque sint conversa de Graecis? nam si 62 | dicent ab illis has res esse tractatas, ne ipsos quidem Graecos est 63 | cur tam multos legant, quam legendi sunt. quid enim est a Chrysippo 64 | praetermissum in Stoicis? legimus tamen Diogenem, Antipatrum, 65 | Mnesarchum, Panaetium, multos alios in primisque familiarem nostrum 66 | Posidonium. quid? Theophrastus mediocriterne delectat, cum tractat 67 | locos ab Aristotele ante tractatos? quid? Epicurei num desistunt de 68 | isdem, de quibus et ab Epicuro scriptum est et ab antiquis, ad 69 | arbitrium suum scribere? quodsi Graeci leguntur a Graecis isdem de 70 | rebus alia ratione compositis, quid est, cur nostri a nostris non 71 | legantur? 72 | 73 | Quamquam, si plane sic verterem Platonem aut Aristotelem, ut verterunt 74 | nostri poetae fabulas, male, credo, mererer de meis civibus, si ad 75 | eorum cognitionem divina illa ingenia transferrem. sed id neque feci 76 | adhuc nec mihi tamen, ne faciam, interdictum puto. locos quidem 77 | quosdam, si videbitur, transferam, et maxime ab iis, quos modo 78 | nominavi, cum inciderit, ut id apte fieri possit, ut ab Homero Ennius, 79 | Afranius a Menandro solet. Nec vero, ut noster Lucilius, recusabo, quo 80 | minus omnes mea legant. utinam esset ille Persius, Scipio vero et 81 | Rutilius multo etiam magis, quorum ille iudicium reformidans 82 | Tarentinis ait se et Consentinis et Siculis scribere. facete is 83 | quidem, sicut alia; sed neque tam docti tum erant, ad quorum iudicium 84 | elaboraret, et sunt illius scripta leviora, ut urbanitas summa 85 | appareat, doctrina mediocris. 86 | 87 | Ego autem quem timeam lectorem, cum ad te ne Graecis quidem cedentem 88 | in philosophia audeam scribere? quamquam a te ipso id quidem facio 89 | provocatus gratissimo mihi libro, quem ad me de virtute misisti. Sed 90 | ex eo credo quibusdam usu venire; ut abhorreant a Latinis, quod 91 | inciderint in inculta quaedam et horrida, de malis Graecis Latine 92 | scripta deterius. quibus ego assentior, dum modo de isdem rebus ne 93 | Graecos quidem legendos putent. res vero bonas verbis electis graviter 94 | ornateque dictas quis non legat? nisi qui se plane Graecum dici velit, 95 | ut a Scaevola est praetore salutatus Athenis Albucius. 96 | 97 | Quem quidem locum comit multa venustate et omni sale idem Lucilius, 98 | apud quem praeclare Scaevola: Graecum te, Albuci, quam Romanum atque 99 | Sabinum, municipem Ponti, Tritani, centurionum, praeclarorum hominum 100 | ac primorum signiferumque, maluisti dici. Graece ergo praetor Athenis, 101 | id quod maluisti, te, cum ad me accedis, saluto: 'chaere,' inquam, 102 | 'Tite!' lictores, turma omnis chorusque: 'chaere, Tite!' hinc hostis 103 | mi Albucius, hinc inimicus. 104 | 105 | Sed iure Mucius. ego autem mirari satis non queo unde hoc sit tam 106 | insolens domesticarum rerum fastidium. non est omnino hic docendi 107 | locus; sed ita sentio et saepe disserui, Latinam linguam non modo non 108 | inopem, ut vulgo putarent, sed locupletiorem etiam esse quam Graecam. 109 | quando enim nobis, vel dicam aut oratoribus bonis aut poetis, postea 110 | quidem quam fuit quem imitarentur, ullus orationis vel copiosae vel 111 | elegantis ornatus defuit? Ego vero, quoniam forensibus operis, 112 | laboribus, periculis non deseruisse mihi videor praesidium, in quo a 113 | populo Romano locatus sum, debeo profecto, quantumcumque possum, in eo 114 | quoque elaborare, ut sint opera, studio, labore meo doctiores cives 115 | mei, nec cum istis tantopere pugnare, qui Graeca legere malint, modo 116 | legant illa ipsa, ne simulent, et iis servire, qui vel utrisque 117 | litteris uti velint vel, si suas habent, illas non magnopere 118 | desiderent. 119 | 120 | Qui autem alia malunt scribi a nobis, aequi esse debent, quod et 121 | scripta multa sunt, sic ut plura nemini e nostris, et scribentur 122 | fortasse plura, si vita suppetet; et tamen, qui diligenter haec, quae 123 | de philosophia litteris mandamus, legere assueverit, iudicabit nulla 124 | ad legendum his esse potiora. quid est enim in vita tantopere 125 | quaerendum quam cum omnia in philosophia, tum id, quod his libris 126 | quaeritur, qui sit finis, quid extremum, quid ultimum, quo sint omnia 127 | bene vivendi recteque faciendi consilia referenda, quid sequatur 128 | natura ut summum ex rebus expetendis, quid fugiat ut extremum malorum? 129 | qua de re cum sit inter doctissimos summa dissensio, quis alienum 130 | putet eius esse dignitatis, quam mihi quisque tribuat, quid in omni 131 | munere vitae optimum et verissimum sit, exquirere? 132 | 133 | An, partus ancillae sitne in fructu habendus, disseretur inter 134 | principes civitatis, P. Scaevolam M'.que Manilium, ab iisque M. Brutus 135 | dissentiet -- quod et acutum genus est et ad usus civium non inutile, 136 | nosque ea scripta reliquaque eiusdem generis et legimus libenter et 137 | legemus --, haec, quae vitam omnem continent, neglegentur? nam, ut 138 | sint illa vendibiliora, haec uberiora certe sunt. quamquam id quidem 139 | licebit iis existimare, qui legerint. nos autem hanc omnem quaestionem 140 | de finibus bonorum et malorum fere a nobis explicatam esse his 141 | litteris arbitramur, in quibus, quantum potuimus, non modo quid nobis 142 | probaretur, sed etiam quid a singulis philosophiae disciplinis 143 | diceretur, persecuti sumus. 144 | 145 | Ut autem a facillimis ordiamur, prima veniat in medium Epicuri ratio, 146 | quae plerisque notissima est. quam a nobis sic intelleges eitam, ut ab 147 | ipsis, qui eam disciplinam probant, non soleat accuratius explicari; 148 | verum enim invenire volumus, non tamquam adversarium aliquem 149 | convincere. accurate autem quondam a L. Torquato, homine omni doctrina 150 | erudito, defensa est Epicuri sententia de voluptate, a meque ei 151 | responsum, cum C. Triarius, in primis gravis et doctus adolescens, ei 152 | disputationi interesset. 153 | 154 | Nam cum ad me in Cumanum salutandi causa uterque venisset, pauca primo 155 | inter nos de litteris, quarum summum erat in utroque studium, deinde 156 | Torquatus: Quoniam nacti te, inquit, sumus aliquando otiosum, certe 157 | audiam, quid sit, quod Epicurum nostrum non tu quidem oderis, ut fere 158 | faciunt, qui ab eo dissentiunt, sed certe non probes, eum quem ego 159 | arbitror unum vidisse verum maximisque erroribus animos hominum 160 | liberavisse et omnia tradidisse, quae pertinerent ad bene beateque 161 | vivendum. sed existimo te, sicut nostrum Triarium, minus ab eo 162 | delectari, quod ista Platonis, Aristoteli, Theophrasti orationis 163 | ornamenta neglexerit. nam illud quidem adduci vix possum, ut ea, quae 164 | senserit ille, tibi non vera videantur. 165 | 166 | Vide, quantum, inquam, fallare, Torquate. oratio me istius philosophi 167 | non offendit; nam et complectitur verbis, quod vult, et dicit plane, 168 | quod intellegam; et tamen ego a philosopho, si afferat eloquentiam, 169 | non asperner, si non habeat, non admodum flagitem. re mihi non aeque 170 | satisfacit, et quidem locis pluribus. sed quot homines, tot 171 | sententiae; falli igitur possumus. 172 | 173 | Quam ob rem tandem, inquit, non satisfacit? te enim iudicem aequum 174 | puto, modo quae dicat ille bene noris. 175 | 176 | Nisi mihi Phaedrum, inquam, tu mentitum aut Zenonem putas, quorum 177 | utrumque audivi, cum mihi nihil sane praeter sedulitatem probarent, 178 | omnes mihi Epicuri sententiae satis notae sunt. atque eos, quos 179 | nominavi, cum Attico nostro frequenter audivi, cum miraretur ille 180 | quidem utrumque, Phaedrum autem etiam amaret, cotidieque inter nos ea, 181 | quae audiebamus, conferebamus, neque erat umquam controversia, quid 182 | ego intellegerem, sed quid probarem. 183 | 184 | Quid igitur est? inquit; audire enim cupio, quid non probes. 185 | Principio, inquam, in physicis, quibus maxime gloriatur, primum totus 186 | est alienus. Democritea dicit perpauca mutans, sed ita, ut ea, quae 187 | corrigere vult, mihi quidem depravare videatur. ille atomos quas 188 | appellat, id est corpora individua propter soliditatem, censet in 189 | infinito inani, in quo nihil nec summum nec infimum nec medium nec 190 | ultimum nec extremum sit, ita ferri, ut concursionibus inter se 191 | cohaerescant, ex quo efficiantur ea, quae sint quaeque cernantur, 192 | omnia, eumque motum atomorum nullo a principio, sed ex aeterno tempore 193 | intellegi convenire. 194 | 195 | Epicurus autem, in quibus sequitur Democritum, non fere labitur. 196 | quamquam utriusque cum multa non probo, tum illud in primis, quod, cum 197 | in rerum natura duo quaerenda sint, unum, quae materia sit, ex qua 198 | quaeque res efficiatur, alterum, quae vis sit, quae quidque efficiat, 199 | de materia disseruerunt, vim et causam efficiendi reliquerunt. sed hoc 200 | commune vitium, illae Epicuri propriae ruinae: censet enim eadem illa 201 | individua et solida corpora ferri deorsum suo pondere ad lineam, hunc 202 | naturalem esse omnium corporum motum. 203 | 204 | Deinde ibidem homo acutus, cum illud ocurreret, si omnia deorsus e 205 | regione ferrentur et, ut dixi, ad lineam, numquam fore ut atomus 206 | altera alteram posset attingere itaque ** attulit rem commenticiam: 207 | declinare dixit atomum perpaulum, quo nihil posset fieri minus; ita 208 | effici complexiones et copulationes et adhaesiones atomorum inter se, 209 | ex quo efficeretur mundus omnesque partes mundi, quaeque in eo essent. 210 | Quae cum tota res (est) ficta pueriliter, tum ne efficit quidem, quod 211 | vult. nam et ipsa declinatio ad libidinem fingitur -- ait enim 212 | declinare atomum sine causa; quo nihil turpius physico, quam fieri 213 | quicquam sine causa dicere, -- et illum motum naturalem omnium 214 | ponderum, ut ipse constituit, e regione inferiorem locum petentium 215 | sine causa eripuit atomis nec tamen id, cuius causa haec finxerat, 216 | assecutus est. 217 | 218 | Nam si omnes atomi declinabunt, nullae umquam cohaerescent, sive aliae 219 | declinabunt, aliae suo nutu recte ferentur, primum erit hoc quasi, 220 | provincias atomis dare, quae recte, quae oblique ferantur, deinde 221 | eadem illa atomorum, in quo etiam Democritus haeret, turbulenta 222 | concursio hunc mundi ornatum efficere non poterit. ne illud quidem 223 | physici, credere aliquid esse minimum, quod profecto numquam 224 | putavisset, si a Polyaeno, familiari suo, geometrica discere maluisset 225 | quam illum etiam ipsum dedocere. Sol Democrito magnus videtur, quippe 226 | homini erudito in geometriaque perfecto, huic pedalis fortasse; tantum 227 | enim esse censet, quantus videtur, vel paulo aut maiorem aut minorem. 228 | 229 | Ita, quae mutat, ea corrumpit, quae sequitur sunt tota Democriti, 230 | atomi, inane, imagines, quae eidola nominant, quorum incursione non 231 | solum videamus, sed etiam cogitemus; infinitio ipsa, quam apeirian 232 | vocant, tota ab illo est, tum innumerabiles mundi, qui et oriantur et 233 | intereant cotidie. Quae etsi mihi nullo modo probantur, tamen 234 | Democritum laudatum a ceteris ab hoc, qui eum unum secutus esset, 235 | nollem vituperatum. 236 | 237 | Iam in altera philosophiae parte. quae est quaerendi ac disserendi, 238 | quae logikh dicitur, iste vester plane, ut mihi quidem videtur, 239 | inermis ac nudus est. tollit definitiones, nihil de dividendo ac 240 | partiendo docet, non quo modo efficiatur concludaturque ratio tradit, 241 | non qua via captiosa solvantur ambigua distinguantur ostendit; iudicia 242 | rerum in sensibus ponit, quibus si semel aliquid falsi pro vero 243 | probatum sit, sublatum esse omne iudicium veri et falsi putat. 244 | 245 | Confirmat autem illud vel maxime, quod ipsa natura, ut ait ille, 246 | sciscat et probet, id est voluptatem et dolorem. ad haec et quae 247 | sequamur et quae fugiamus refert omnia. quod quamquam Aristippi est a 248 | Cyrenaicisque melius liberiusque defenditur, tamen eius modi esse 249 | iudico, ut nihil homine videatur indignius. ad maiora enim quaedam nos 250 | natura genuit et conformavit, ut mihi quidem videtur. ac fieri potest, 251 | ut errem, sed ita prorsus existimo, neque eum Torquatum, qui hoc 252 | primus cognomen invenerit, aut torquem illum hosti detraxisse, ut 253 | aliquam ex eo perciperet corpore voluptatem, aut cum Latinis tertio 254 | consulatu conflixisse apud Veserim propter voluptatem; quod vero 255 | securi percussit filium, privavisse se etiam videtur multis 256 | voluptatibus, cum ipsi naturae patrioque amori praetulerit ius 257 | maiestatis atque imperii. 258 | 259 | quid? T. Torquatus, is qui consul cum Cn. Octavio fuit, cum illam 260 | severitatem in eo filio adhibuit, quem in adoptionem D. Silano 261 | emancipaverat, ut eum Macedonum legatis accusantibus, quod pecunias 262 | praetorem in provincia cepisse arguerent, causam apud se dicere 263 | iuberet reque ex utraque parte audita pronuntiaret eum non talem 264 | videri fuisse in imperio, quales eius maiores fuissent, et in 265 | conspectum suum venire vetuit, numquid tibi videtur de voluptatibus 266 | suis cogitavisse? 267 | 268 | Sed ut omittam pericula, labores, dolorem etiam, quem optimus quisque 269 | pro patria et pro suis suscipit, ut non modo nullam captet, sed etiam 270 | praetereat omnes voluptates, dolores denique quosvis suscipere malit 271 | quam deserere ullam officii partem, ad ea, quae hoc non minus 272 | declarant, sed videntur leviora, veniamus. 273 | 274 | Quid tibi, Torquate, quid huic Triario litterae, quid historiae 275 | cognitioque rerum, quid poetarum evolutio, quid tanta tot versuum 276 | memoria voluptatis affert? nec mihi illud dixeris: 'Haec enim ipsa 277 | mihi sunt voluptati, et erant illa Torquatis.' Numquam hoc ita 278 | defendit Epicurus neque Metrodorus aut quisquam eorum, qui aut saperet 279 | aliquid aut ista didicisset. et quod quaeritur saepe, cur tam multi 280 | sint Epicurei, sunt aliae quoque causae, sed multitudinem haec maxime 281 | allicit, quod ita putant dici ab illo, recta et honesta quae sint, ea 282 | facere ipsa per se laetitiam, id est voluptatem. homines optimi non 283 | intellegunt totam rationem everti, si ita res se habeat. nam si 284 | concederetur, etiamsi ad corpus nihil referatur, ista sua sponte et 285 | per se esse iucunda, per se esset et virtus et cognitio rerum, quod 286 | minime ille vult expetenda. 287 | 288 | Haec igitur Epicuri non probo, inquam. De cetero vellem equidem aut 289 | ipse doctrinis fuisset instructior -- est enim, quod tibi ita videri 290 | necesse est, non satis politus iis artibus, quas qui tenent, eruditi 291 | appellantur -- aut ne deterruisset alios a studiis. quamquam te quidem 292 | video minime esse deterritum. 293 | 294 | Quae cum dixissem, magis ut illum provocarem quam ut ipse loquerer, 295 | tum Triarius leniter arridens: Tu quidem, inquit, totum Epicurum paene 296 | e philosophorum choro sustulisti. Quid ei reliquisti, nisi te, quoquo 297 | modo loqueretur, intellegere, quid diceret? Aliena dixit in physicis 298 | nec ea ipsa, quae tibi probarentur; si qua in iis corrigere voluit, 299 | deteriora fecit. disserendi artem nullam habuit. voluptatem cum summum 300 | bonum diceret, primum in eo ipso parum vidit, deinde hoc quoque 301 | alienum; nam ante Aristippus, et ille melius. addidisti ad extremum 302 | etiam indoctum fuisse. 303 | 304 | Fieri, inquam, Triari, nullo pacto potest, ut non dicas, quid non 305 | probes eius, a quo dissentias. quid enim me prohiberet Epicureum esse, 306 | si probarem, quae ille diceret? cum praesertim illa perdiscere ludus 307 | esset. Quam ob rem dissentientium inter se reprehensiones non sunt 308 | vituperandae, maledicta, contumeliae, tum iracundiae, contentiones 309 | concertationesque in disputando pertinaces indignae philosophia mihi 310 | videri solent. 311 | 312 | Tum Torquatus: Prorsus, inquit, assentior; neque enim disputari sine 313 | reprehensione nec cum iracundia aut pertinacia recte disputari potest. 314 | sed ad haec, nisi molestum est, habeo quae velim. An me, inquam, nisi 315 | te audire vellem, censes haec dicturum fuisse? Utrum igitur percurri 316 | omnem Epicuri disciplinam placet an de una voluptate quaeri, de qua 317 | omne certamen est? Tuo vero id quidem, inquam, arbitratu. Sic faciam 318 | igitur, inquit: unam rem explicabo, eamque maximam, de physicis alias, 319 | et quidem tibi et declinationem istam atomorum et magnitudinem solis 320 | probabo et Democriti errata ab Epicuro reprehensa et correcta 321 | permulta. nunc dicam de voluptate, nihil scilicet novi, ea tamen, quae 322 | te ipsum probaturum esse confidam. 323 | 324 | Certe, inquam, pertinax non ero tibique, si mihi probabis ea, quae 325 | dices, libenter assentiar. Probabo, inquit, modo ista sis aequitate, 326 | quam ostendis. sed uti oratione perpetua malo quam interrogare aut 327 | interrogari. Ut placet, inquam. Tum dicere exorsus est. Primum igitur, 328 | inquit, sic agam, ut ipsi auctori huius disciplinae placet: 329 | constituam, quid et quale sit id, de quo quaerimus, non quo ignorare 330 | vos arbitrer, sed ut ratione et via procedat oratio. quaerimus igitur, 331 | quid sit extremum et ultimum bonorum, quod omnium philosophorum 332 | sententia tale debet esse, ut ad id omnia referri oporteat, ipsum 333 | autem nusquam. hoc Epicurus in voluptate ponit, quod summum bonum esse 334 | vult, summumque malum dolorem, idque instituit docere sic: 335 | 336 | Omne animal, simul atque natum sit, voluptatem appetere eaque gaudere 337 | ut summo bono, dolorem aspernari ut summum malum et, quantum possit, a 338 | se repellere, idque facere nondum depravatum ipsa natura incorrupte 339 | atque integre iudicante. itaque negat opus esse ratione neque 340 | disputatione, quam ob rem voluptas expetenda, fugiendus dolor sit. 341 | sentiri haec putat, ut calere ignem, nivem esse albam, dulce mel. 342 | quorum nihil oportere exquisitis rationibus confirmare, tantum satis 343 | esse admonere. interesse enim inter argumentum conclusionemque 344 | rationis et inter mediocrem animadversionem atque admonitionem. altera 345 | occulta quaedam et quasi involuta aperiri, altera prompta et aperta 346 | iudicari. etenim quoniam detractis de homine sensibus reliqui nihil 347 | est, necesse est, quid aut ad naturam aut contra sit, a natura ipsa 348 | iudicari. ea quid percipit aut quid iudicat, quo aut petat aut fugiat 349 | aliquid, praeter voluptatem et dolorem? 350 | 351 | Sunt autem quidam e nostris, qui haec subtilius velint tradere et 352 | negent satis esse, quid bonum sit aut quid malum, sensu iudicari, sed 353 | animo etiam ac ratione intellegi posse et voluptatem ipsam per se esse 354 | expetendam et dolorem ipsum per se esse fugiendum. itaque aiunt hanc 355 | quasi naturalem atque insitam in animis nostris inesse notionem, ut 356 | alterum esse appetendum, alterum aspernandum sentiamus. Alii autem, 357 | quibus ego assentior, cum a philosophis compluribus permulta dicantur, 358 | cur nec voluptas in bonis sit numeranda nec in malis dolor, non 359 | existimant oportere nimium nos causae confidere, sed et argumentandum 360 | et accurate disserendum et rationibus conquisitis de voluptate et 361 | dolore disputandum putant. 362 | 363 | Sed ut perspiciatis, unde omnis iste natus error sit voluptatem 364 | accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae 365 | ab illo inventore veritatis et quasi architecto beatae vitae dicta 366 | sunt, explicabo. nemo enim ipsam voluptatem, quia voluptas sit, 367 | aspernatur aut odit aut fugit, sed quia consequuntur magni dolores 368 | eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, 369 | qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, 370 | sed quia non numquam eius modi tempora incidunt, ut labore et dolore 371 | magnam aliquam quaerat voluptatem. ut enim ad minima veniam, quis 372 | nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut 373 | aliquid ex ea commodi consequatur? quis autem vel eum iure 374 | reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae 375 | consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla 376 | pariatur? 377 | 378 | At vero eos et accusamus et iusto odio dignissimos ducimus, qui 379 | blanditiis praesentium voluptatum deleniti atque corrupti, quos 380 | dolores et quas molestias excepturi sint, obcaecati cupiditate non 381 | provident, similique sunt in culpa, qui officia deserunt mollitia 382 | animi, id est laborum et dolorum fuga. et harum quidem rerum facilis 383 | est et expedita distinctio. nam libero tempore, cum soluta nobis est 384 | eligendi optio, cumque nihil impedit, quo minus id, quod maxime 385 | placeat, facere possimus, omnis voluptas assumenda est, omnis dolor 386 | repellendus. temporibus autem quibusdam et aut officiis debitis aut 387 | rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint 388 | et molestiae non recusandae. itaque earum rerum hic tenetur a sapiente 389 | delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut 390 | perferendis doloribus asperiores repellat. 391 | 392 | Hanc ego cum teneam sententiam, quid est cur verear, ne ad eam non 393 | possim accommodare Torquatos nostros? quos tu paulo ante cum 394 | memoriter, tum etiam erga nos amice et benivole collegisti, nec me 395 | tamen laudandis maioribus meis corrupisti nec segniorem ad 396 | respondendum reddidisti. quorum facta quem ad modum, quaeso, 397 | interpretaris? sicine eos censes aut in armatum hostem impetum fecisse 398 | aut in liberos atque in sanguinem suum tam crudelis fuisse, nihil ut 399 | de utilitatibus, nihil ut de commodis suis cogitarent? at id ne ferae 400 | quidem faciunt, ut ita ruant itaque turbent, ut earum motus et impetus 401 | quo pertineant non intellegamus, tu tam egregios viros censes tantas 402 | res gessisse sine causa? 403 | 404 | Quae fuerit causa, mox videro; interea hoc tenebo, si ob aliquam 405 | causam ista, quae sine dubio praeclara sunt, fecerint, virtutem iis 406 | per se ipsam causam non fuisse. -- Torquem detraxit hosti. -- Et 407 | quidem se texit, ne interiret. -- At magnum periculum adiit. -- In 408 | oculis quidem exercitus. -- Quid ex eo est consecutus? -- Laudem et 409 | caritatem, quae sunt vitae sine metu degendae praesidia firmissima. -- 410 | Filium morte multavit. -- Si sine causa, nollem me ab eo ortum, tam 411 | inportuno tamque crudeli; sin, ut dolore suo sanciret militaris 412 | imperii disciplinam exercitumque in gravissimo bello animadversionis 413 | metu contineret, saluti prospexit civium, qua intellegebat contineri 414 | suam. atque haec ratio late patet. 415 | 416 | In quo enim maxime consuevit iactare vestra se oratio, tua praesertim, 417 | qui studiose antiqua persequeris, claris et fortibus viris 418 | commemorandis eorumque factis non emolumento aliquo, sed ipsius 419 | honestatis decore laudandis, id totum evertitur eo delectu rerum, quem 420 | modo dixi, constituto, ut aut voluptates omittantur maiorum voluptatum 421 | adipiscendarum causa aut dolores suscipiantur maiorum dolorum 422 | effugiendorum gratia. 423 | 424 | Sed de clarorum hominum factis illustribus et gloriosis satis hoc loco 425 | dictum sit. erit enim iam de omnium virtutum cursu ad voluptatem 426 | proprius disserendi locus. nunc autem explicabo, voluptas ipsa quae 427 | qualisque sit, ut tollatur error omnis imperitorum intellegaturque ea, 428 | quae voluptaria, delicata, mollis habeatur disciplina, quam gravis, 429 | quam continens, quam severa sit. Non enim hanc solam sequimur, quae 430 | suavitate aliqua naturam ipsam movet et cum iucunditate quadam 431 | percipitur sensibus, sed maximam voluptatem illam habemus, quae 432 | percipitur omni dolore detracto, nam quoniam, cum privamur dolore, 433 | ipsa liberatione et vacuitate omnis molestiae gaudemus, omne autem id, 434 | quo gaudemus, voluptas est, ut omne, quo offendimur, dolor, doloris 435 | omnis privatio recte nominata est voluptas. ut enim, cum cibo et 436 | potione fames sitisque depulsa est, ipsa detractio molestiae 437 | consecutionem affert voluptatis, sic in omni re doloris amotio 438 | successionem efficit voluptatis. 439 | 440 | Itaque non placuit Epicuro medium esse quiddam inter dolorem et 441 | voluptatem; illud enim ipsum, quod quibusdam medium videretur, cum 442 | omni dolore careret, non modo voluptatem esse, verum etiam summam 443 | voluptatem. quisquis enim sentit, quem ad modum sit affectus, eum 444 | necesse est aut in voluptate esse aut in dolore. omnis autem 445 | privatione doloris putat Epicurus terminari summam voluptatem, ut 446 | postea variari voluptas distinguique possit, augeri amplificarique non 447 | possit. 448 | 449 | At etiam Athenis, ut e patre audiebam facete et urbane Stoicos 450 | irridente, statua est in Ceramico Chrysippi sedentis porrecta manu, 451 | quae manus significet illum in hae esse rogatiuncula delectatum: 452 | 'Numquidnam manus tua sic affecta, quem ad modum affecta nunc est, 453 | desiderat?' -- Nihil sane. -- 'At, si voluptas esset bonum, 454 | desideraret.' -- Ita credo. -- 'Non est igitur voluptas bonum.' Hoc ne 455 | statuam quidem dicturam pater aiebat, si loqui posset. conclusum est 456 | enim contra Cyrenaicos satis acute, nihil ad Epicurum. nam si ea sola 457 | voluptas esset, quae quasi titillaret sensus, ut ita dicam, et ad eos 458 | cum suavitate afflueret et illaberetur, nec manus esse contenta posset 459 | nec ulla pars vacuitate doloris sine iucundo motu voluptatis. sin 460 | autem summa voluptas est, ut Epicuro placet, nihil dolere, primum tibi 461 | recte, Chrysippe, concessum est nihil desiderare manum, cum ita esset 462 | affecta, secundum non recte, si voluptas esset bonum, fuisse 463 | desideraturam. idcirco enim non desideraret, quia, quod dolore caret, 464 | id in voluptate est. 465 | 466 | Extremum autem esse bonorum voluptatem ex hoc facillime perspici 467 | potest: Constituamus aliquem magnis, multis, perpetuis fruentem et 468 | animo et corpore voluptatibus nullo dolore nec impediente nec 469 | inpendente, quem tandem hoc statu praestabiliorem aut magis expetendum 470 | possimus dicere? inesse enim necesse est in eo, qui ita sit affectus, 471 | et firmitatem animi nec mortem nec dolorem timentis, quod mors sensu 472 | careat, dolor in longinquitate levis, in gravitate brevis soleat esse, 473 | ut eius magnitudinem celeritas, diuturnitatem allevatio consoletur. 474 | 475 | Ad ea cum accedit, ut neque divinum numen horreat nec praeteritas 476 | voluptates effluere patiatur earumque assidua recordatione laetetur, 477 | quid est, quod huc possit, quod melius sit, accedere? Statue contra 478 | aliquem confectum tantis animi corporisque doloribus, quanti in 479 | hominem maximi cadere possunt, nulla spe proposita fore levius 480 | aliquando, nulla praeterea neque praesenti nec expectata voluptate, 481 | quid eo miserius dici aut fingi potest? quodsi vita doloribus referta 482 | maxime fugienda est, summum profecto malum est vivere cum dolore, cui 483 | sententiae consentaneum est ultimum esse bonorum eum voluptate vivere. 484 | nec enim habet nostra mens quicquam, ubi consistat tamquam in extremo, 485 | omnesque et metus et aegritudines ad dolorem referuntur, nec praeterea 486 | est res ulla, quae sua natura aut sollicitare possit aut angere. 487 | 488 | Praeterea et appetendi et refugiendi et omnino rerum gerendarum initia 489 | proficiscuntur aut a voluptate aut a dolore. quod cum ita sit, 490 | perspicuum est omnis rectas res atque laudabilis eo referri, ut cum 491 | voluptate vivatur. quoniam autem id est vel summum bonorum vel ultimum 492 | vel extremum -- quod Graeci telos nominant --, quod ipsum nullam ad 493 | aliam rem, ad id autem res referuntur omnes, fatendum est summum esse 494 | bonum iucunde vivere. 495 | 496 | Id qui in una virtute ponunt et splendore nominis capti quid natura 497 | postulet non intellegunt, errore maximo, si Epicurum audire voluerint, 498 | liberabuntur: istae enim vestrae eximiae pulchraeque virtutes nisi 499 | voluptatem efficerent, quis eas aut laudabilis aut expetendas 500 | arbitraretur? ut enim medicorum scientiam non ipsius artis, sed bonae 501 | valetudinis causa probamus, et gubernatoris ars, quia bene navigandi 502 | rationem habet, utilitate, non arte laudatur, sic sapientia, quae ars 503 | vivendi putanda est, non expeteretur, si nihil efficeret; nunc 504 | expetitur, quod est tamquam artifex conquirendae et comparandae 505 | voluptatis -- 506 | 507 | Quam autem ego dicam voluptatem, iam videtis, ne invidia verbi 508 | labefactetur oratio mea --. nam cum ignoratione rerum bonarum et 509 | malarum maxime hominum vita vexetur, ob eumque errorem et voluptatibus 510 | maximis saepe priventur et durissimis animi doloribus torqueantur, 511 | sapientia est adhibenda, quae et terroribus cupiditatibusque detractis 512 | et omnium falsarum opinionum temeritate derepta certissimam se nobis 513 | ducem praebeat ad voluptatem. sapientia enim est una, quae maestitiam 514 | pellat ex animis, quae nos exhorrescere metu non sinat. qua 515 | praeceptrice in tranquillitate vivi potest omnium cupiditatum ardore 516 | restincto. cupiditates enim sunt insatiabiles, quae non modo singulos 517 | homines, sed universas familias evertunt, totam etiam labefactant 518 | saepe rem publicam. 519 | 520 | Ex cupiditatibus odia, discidia, discordiae, seditiones, bella 521 | nascuntur, nec eae se foris solum iactant nec tantum in alios caeco 522 | impetu incurrunt, sed intus etiam in animis inclusae inter se 523 | dissident atque discordant, ex quo vitam amarissimam necesse est 524 | effici, ut sapiens solum amputata circumcisaque inanitate omni et 525 | errore naturae finibus contentus sine aegritudine possit et sine metu 526 | vivere. 527 | 528 | Quae est enim aut utilior aut ad bene vivendum aptior partitio quam 529 | illa, qua est usus Epicurus? qui unum genus posuit earum cupiditatum, 530 | quae essent et naturales et necessariae, alterum, quae naturales 531 | essent nec tamen necessariae, tertium, quae nec naturales nec 532 | necessariae. quarum ea ratio est, ut necessariae nec opera multa nec 533 | impensa expleantur; ne naturales quidem multa desiderant, propterea 534 | quod ipsa natura divitias, quibus contenta sit, et parabilis et 535 | terminatas habet; inanium autem cupiditatum nec modus ullus nec finis 536 | inveniri potest. 537 | 538 | Quodsi vitam omnem perturbari videmus errore et inscientia, 539 | sapientiamque esse solam, quae nos a libidinum impetu et a formidinum 540 | terrore vindicet et ipsius fortunae modice ferre doceat iniurias et 541 | omnis monstret vias, quae ad quietem et ad tranquillitatem ferant, 542 | quid est cur dubitemus dicere et sapientiam propter voluptates 543 | expetendam et insipientiam propter molestias esse fugiendam? 544 | 545 | Eademque ratione ne temperantiam quidem propter se expetendam esse 546 | dicemus, sed quia pacem animis afferat et eos quasi concordia quadam 547 | placet ac leniat. temperantia est enim, quae in rebus aut expetendis 548 | aut fugiendis ut rationem sequamur monet. nec enim satis est iudicare 549 | quid faciendum non faciendumve sit, sed stare etiam oportet in eo, 550 | quod sit iudicatum. plerique autem, quod tenere atque servare id, quod 551 | ipsi statuerunt, non possunt, victi et debilitati obiecta specie 552 | voluptatis tradunt se libidinibus constringendos nec quid eventurum 553 | sit provident ob eamque causam propter voluptatem et parvam et non 554 | necessariam et quae vel aliter pararetur et qua etiam carere possent 555 | sine dolore tum in morbos gravis, tum in damna, tum in dedecora 556 | incurrunt, saepe etiam legum iudiciorumque poenis obligantur. 557 | 558 | Qui autem ita frui volunt voluptatibus, ut nulli propter eas 559 | consequantur dolores, et qui suum iudicium retinent, ne voluptate 560 | victi faciant id, quod sentiant non esse faciendum, ii voluptatem 561 | maximam adipiscuntur praetermittenda voluptate. idem etiam dolorem 562 | saepe perpetiuntur, ne, si id non faciant, incidant in maiorem. ex quo 563 | intellegitur nec intemperantiam propter se esse fugiendam 564 | temperantiamque expetendam, non quia voluptates fugiat, sed quia 565 | maiores consequatur. 566 | 567 | Eadem fortitudinis ratio reperietur. nam neque laborum perfunctio 568 | neque perpessio dolorum per se ipsa allicit nec patientia nec 569 | assiduitas nec vigiliae nec ea ipsa, quae laudatur, industria, ne 570 | fortitudo quidem, sed ista sequimur, ut sine cura metuque vivamus 571 | animumque et corpus, quantum efficere possimus, molestia liberemus. ut 572 | enim mortis metu omnis quietae vitae status perturbatur, et ut 573 | succumbere doloribus eosque humili animo inbecilloque ferre miserum 574 | est, ob eamque debilitatem animi multi parentes, multi amicos, non 575 | nulli patriam, plerique autem se ipsos penitus perdiderunt, sic 576 | robustus animus et excelsus omni est liber cura et angore, cum et 577 | mortem contemnit, qua qui affecti sunt in eadem causa sunt, qua ante 578 | quam nati, et ad dolores ita paratus est, ut meminerit maximos morte 579 | finiri, parvos multa habere intervalla requietis, mediocrium nos esse 580 | dominos, ut, si tolerabiles sint, feramus, si minus, animo aequo e 581 | vita, cum ea non placeat, tamquam e theatro exeamus. quibus rebus 582 | intellegitur nec timiditatem ignaviamque vituperari nec fortitudinem 583 | patientiamque laudari suo nomine, sed illas reici, quia dolorem 584 | pariant, has optari, quia voluptatem. 585 | 586 | Iustitia restat, ut de omni virtute sit dictum. sed similia fere dici 587 | possunt. ut enim sapientiam, temperantiam, fortitudinem copulatas esse 588 | docui cum voluptate, ut ab ea nullo modo nec divelli nec distrahi 589 | possint, sic de iustitia iudicandum est, quae non modo numquam nocet 590 | cuiquam, sed contra semper afficit cum vi sua atque natura, quod 591 | tranquillat animos, tum spe nihil earum rerum defuturum, quas natura 592 | non depravata desiderat. et quem ad modum temeritas et libido et 593 | ignavia semper animum excruciant et semper sollicitant turbulentaeque 594 | sunt, sic inprobitas si cuius in mente consedit, hoc ipso, quod adest, 595 | turbulenta est; si vero molita quippiam est, quamvis occulte fecerit, 596 | numquam tamen id confidet fore semper occultum. plerumque improborum 597 | facta primo suspicio insequitur, dein sermo atque fama, tum accusator, 598 | tum iudex; 599 | 600 | Multi etiam, ut te consule, ipsi se indicaverunt. quodsi qui satis 601 | sibi contra hominum conscientiam saepti esse et muniti videntur, 602 | deorum tamen horrent easque ipsas sollicitudines, quibus eorum animi 603 | noctesque diesque exeduntur, a diis inmortalibus supplicii causa 604 | importari putant. quae autem tanta ex improbis factis ad minuendas 605 | vitae molestias accessio potest fieri, quanta ad augendas, cum 606 | conscientia factorum, tum poena legum odioque civium? et tamen in 607 | quibusdam neque pecuniae modus est neque honoris neque imperii nec 608 | libidinum nec epularum nec reliquarum cupiditatum, quas nulla praeda 609 | umquam improbe parta minuit, sed potius inflammat, ut coercendi magis 610 | quam dedocendi esse videantur. 611 | 612 | Invitat igitur vera ratio bene sanos ad iustitiam, aequitatem, fidem, 613 | neque homini infanti aut inpotenti iniuste facta conducunt, qui nec 614 | facile efficere possit, quod conetur, nec optinere, si effecerit, et 615 | opes vel fortunae vel ingenii liberalitati magis conveniunt, qua qui 616 | utuntur, benivolentiam sibi conciliant et, quod aptissimum est ad 617 | quiete vivendum, caritatem, praesertim cum omnino nulla sit causa 618 | peccandi. 619 | 620 | Quae enim cupiditates a natura proficiscuntur, facile explentur sine 621 | ulla iniuria, quae autem inanes sunt, iis parendum non est. nihil enim 622 | desiderabile concupiscunt, plusque in ipsa iniuria detrimenti est quam 623 | in iis rebus emolumenti, quae pariuntur iniuria. Itaque ne iustitiam 624 | quidem recte quis dixerit per se ipsam optabilem, sed quia 625 | iucunditatis vel plurimum afferat. nam diligi et carum esse iucundum 626 | est propterea, quia tutiorem vitam et voluptatem pleniorem efficit. 627 | itaque non ob ea solum incommoda, quae eveniunt inprobis, fugiendam 628 | inprobitatem putamus, sed multo etiam magis, quod, cuius in animo 629 | versatur, numquam sinit eum respirare, numquam adquiescere. 630 | 631 | Quodsi ne ipsarum quidem virtutum laus, in qua maxime ceterorum 632 | philosophorum exultat oratio, reperire exitum potest, nisi derigatur 633 | ad voluptatem, voluptas autem est sola, quae nos vocet ad se et 634 | alliciat suapte natura, non potest esse dubium, quin id sit summum 635 | atque extremum bonorum omnium, beateque vivere nihil aliud sit nisi 636 | cum voluptate vivere. 637 | 638 | Huic certae stabilique sententiae quae sint coniuncta explicabo brevi. 639 | nullus in ipsis error est finibus bonorum et malorum, id est in 640 | voluptate aut in dolore, sed in his rebus peccant, cum e quibus haec 641 | efficiantur ignorant. animi autem voluptates et dolores nasci fatemur 642 | e corporis voluptatibus et doloribus -- itaque concedo, quod modo 643 | dicebas, cadere causa, si qui e nostris aliter existimant, quos quidem 644 | video esse multos, sed imperitos --, quamquam autem et laetitiam nobis 645 | voluptas animi et molestiam dolor afferat, eorum tamen utrumque et 646 | ortum esse e corpore et ad corpus referri, nec ob eam causam non multo 647 | maiores esse et voluptates et dolores animi quam corporis. nam corpore 648 | nihil nisi praesens et quod adest sentire possumus, animo autem et 649 | praeterita et futura. ut enim aeque doleamus animo, cum corpore 650 | dolemus, fieri tamen permagna accessio potest, si aliquod aeternum et 651 | infinitum impendere malum nobis opinemur. quod idem licet transferre 652 | in voluptatem, ut ea maior sit, si nihil tale metuamus. 653 | 654 | Iam illud quidem perspicuum est, maximam animi aut voluptatem aut 655 | molestiam plus aut ad beatam aut ad miseram vitam afferre momenti quam 656 | eorum utrumvis, si aeque diu sit in corpore. Non placet autem detracta 657 | voluptate aegritudinem statim consequi, nisi in voluptatis locum dolor 658 | forte successerit, at contra gaudere nosmet omittendis doloribus, 659 | etiamsi voluptas ea, quae sensum moveat, nulla successerit, eoque 660 | intellegi potest quanta voluptas sit non dolere. 661 | 662 | Sed ut iis bonis erigimur, quae expectamus, sic laetamur iis, quae 663 | recordamur. stulti autem malorum memoria torquentur, sapientes bona 664 | praeterita grata recordatione renovata delectant. est autem situm in 665 | nobis ut et adversa quasi perpetua oblivione obruamus et secunda 666 | iucunde ac suaviter meminerimus. sed cum ea, quae praeterierunt, acri 667 | animo et attento intuemur, tum fit ut aegritudo sequatur, si illa mala 668 | sint, laetitia, si bona. 669 | 670 | O praeclaram beate vivendi et apertam et simplicem et directam viam! 671 | Cum enim certe nihil homini possit melius esse quam vacare omni dolore 672 | et molestia perfruique maximis et animi et corporis voluptatibus, 673 | videtisne quam nihil praetermittatur quod vitam adiuvet, quo facilius 674 | id, quod propositum est, summum bonum consequamur? clamat Epicurus, is 675 | quem vos nimis voluptatibus esse deditum dicitis; non posse iucunde 676 | vivi, nisi sapienter, honeste iusteque vivatur, nec sapienter, 677 | honeste, iuste, nisi iucunde. 678 | 679 | Neque enim civitas in seditione beata esse potest nec in discordia 680 | dominorum domus; quo minus animus a se ipse dissidens secumque 681 | discordans gustare partem ullam liquidae voluptatis et liberae potest. 682 | atqui pugnantibus et contrariis studiis consiliisque semper utens 683 | nihil quieti videre, nihil tranquilli potest. 684 | 685 | Quodsi corporis gravioribus morbis vitae iucunditas impeditur, quanto 686 | magis animi morbis impediri necesse est! animi autem morbi sunt 687 | cupiditates inmensae et inanes divitiarum, gloriae, dominationis, 688 | libidinosarum etiam voluptatum. accedunt aegritudines, molestiae, 689 | maerores, qui exedunt animos conficiuntque curis hominum non 690 | intellegentium nihil dolendum esse animo, quod sit a dolore corporis 691 | praesenti futurove seiunctum. nec vero quisquam stultus non horum 692 | morborum aliquo laborat, nemo igitur est non miser. 693 | 694 | Accedit etiam mors, quae quasi saxum Tantalo semper impendet, tum 695 | superstitio, qua qui est imbutus quietus esse numquam potest. 696 | praeterea bona praeterita non meminerunt, praesentibus non fruuntur, 697 | futura modo expectant, quae quia certa esse non possunt, conficiuntur 698 | et angore et metu maximeque cruciantur, cum sero sentiunt frustra se 699 | aut pecuniae studuisse aut imperiis aut opibus aut gloriae. nullas 700 | enim consequuntur voluptates, quarum potiendi spe inflammati multos 701 | labores magnosque susceperant. 702 | 703 | ecce autem alii minuti et angusti aut omnia semper desperantes aut 704 | malivoli, invidi, difficiles, lucifugi, maledici, monstruosi, alii 705 | autem etiam amatoriis levitatibus dediti, alii petulantes, alii 706 | audaces, protervi, idem intemperantes et ignavi, numquam in sententia 707 | permanentes, quas ob causas in eorum vita nulla est intercapedo 708 | molestiae. igitur neque stultorum quisquam beatus neque sapientium non 709 | beatus. Multoque hoc melius nos veriusque quam Stoici. illi enim 710 | negant esse bonum quicquam nisi nescio quam illam umbram, quod 711 | appellant honestum non tam solido quam splendido nomine, virtutem 712 | autem nixam hoc honesto nullam requirere voluptatem atque ad beate 713 | vivendum se ipsa esse contentam. 714 | 715 | Sed possunt haec quadam ratione dici non modo non repugnantibus, verum 716 | etiam approbantibus nobis. sic enim ab Epicuro sapiens semper beatus 717 | inducitur: finitas habet cupiditates, neglegit mortem, de diis 718 | inmortalibus sine ullo metu vera sentit, non dubitat, si ita melius 719 | sit, migrare de vita. his rebus instructus semper est in voluptate. 720 | neque enim tempus est ullum, quo non plus voluptatum habeat quam 721 | dolorum. nam et praeterita grate meminit et praesentibus ita potitur, 722 | ut animadvertat quanta sint ea quamque iucunda, neque pendet ex 723 | futuris, sed expectat illa, fruitur praesentibus ab iisque vitiis, 724 | quae paulo ante collegi, abest plurimum et, cum stultorum vitam cum 725 | sua comparat, magna afficitur voluptate. dolores autem si qui 726 | incurrunt, numquam vim tantam habent, ut non plus habeat sapiens, quod 727 | gaudeat, quam quod angatur. 728 | 729 | Optime vero Epicurus, quod exiguam dixit fortunam intervenire sapienti 730 | maximasque ab eo et gravissimas res consilio ipsius et ratione 731 | administrari neque maiorem voluptatem ex infinito tempore aetatis 732 | percipi posse, quam ex hoc percipiatur, quod videamus esse finitum. In 733 | dialectica autem vestra nullam existimavit esse nec ad melius vivendum 734 | nec ad commodius disserendum viam. In physicis plurimum posuit. ea 735 | scientia et verborum vis et natura orationis et consequentium 736 | repugnantiumve ratio potest perspici. omnium autem rerum natura 737 | cognita levamur superstitione, liberamur mortis metu, non conturbamur 738 | ignoratione rerum, e qua ipsa horribiles existunt saepe formidines. 739 | denique etiam morati melius erimus, cum didicerimus quid natura 740 | desideret. tum vero, si stabilem scientiam rerum tenebimus, servata 741 | illa, quae quasi delapsa de caelo est ad cognitionem omnium, regula, 742 | ad quam omnia iudicia rerum dirigentur, numquam ullius oratione victi 743 | sententia desistemus. 744 | 745 | Nisi autem rerum natura perspecta erit, nullo modo poterimus sensuum 746 | iudicia defendere. quicquid porro animo cernimus, id omne oritur a 747 | sensibus; qui si omnes veri erunt, ut Epicuri ratio docet, tum denique 748 | poterit aliquid cognosci et percipi. quos qui tollunt et nihil posse 749 | percipi dicunt, ii remotis sensibus ne id ipsum quidem expedire 750 | possunt, quod disserunt. praeterea sublata cognitione et scientia 751 | tollitur omnis ratio et vitae degendae et rerum gerendarum. sic e 752 | physicis et fortitudo sumitur contra mortis timorem et constantia 753 | contra metum religionis et sedatio animi omnium rerum occultarum 754 | ignoratione sublata et moderatio natura cupiditatum generibusque earum 755 | explicatis, et, ut modo docui, cognitionis regula et iudicio ab eadem 756 | illa constituto veri a falso distinctio traditur. 757 | 758 | Restat locus huic disputationi vel maxime necessarius de amicitia, 759 | quam, si voluptas summum sit bonum, affirmatis nullam omnino fore. de 760 | qua Epicurus quidem ita dicit, omnium rerum, quas ad beate vivendum 761 | sapientia comparaverit, nihil esse maius amicitia, nihil uberius, 762 | nihil iucundius. nec vero hoc oratione solum, sed multo magis vita et 763 | factis et moribus comprobavit. quod quam magnum sit fictae veterum 764 | fabulae declarant, in quibus tam multis tamque variis ab ultima 765 | antiquitate repetitis tria vix amicorum paria reperiuntur, ut ad 766 | Orestem pervenias profectus a Theseo. at vero Epicurus una in domo, et 767 | ea quidem angusta, quam magnos quantaque amoris conspiratione 768 | consentientis tenuit amicorum greges! quod fit etiam nunc ab 769 | Epicureis. sed ad rem redeamus; de hominibus dici non necesse est. 770 | 771 | Tribus igitur modis video esse a nostris de amicitia disputatum. alii 772 | cum eas voluptates, quae ad amicos pertinerent, negarent esse per se 773 | ipsas tam expetendas, quam nostras expeteremus, quo loco videtur 774 | quibusdam stabilitas amicitiae vacillare, tuentur tamen eum locum 775 | seque facile, ut mihi videtur, expediunt. ut enim virtutes, de quibus 776 | ante dictum est, sic amicitiam negant posse a voluptate discedere. nam 777 | cum solitudo et vita sine amicis insidiarum et metus plena sit, ratio 778 | ipsa monet amicitias comparare, quibus partis confirmatur animus et a 779 | spe pariendarum voluptatum seiungi non potest. 780 | 781 | Atque ut odia, invidiae, despicationes adversantur voluptatibus, sic 782 | amicitiae non modo fautrices fidelissimae, sed etiam effectrices sunt 783 | voluptatum tam amicis quam sibi, quibus non solum praesentibus 784 | fruuntur, sed etiam spe eriguntur consequentis ac posteri temporis. 785 | quod quia nullo modo sine amicitia firmam et perpetuam iucunditatem 786 | vitae tenere possumus neque vero ipsam amicitiam tueri, nisi aeque 787 | amicos et nosmet ipsos diligamus, idcirco et hoc ipsum efficitur in 788 | amicitia, et amicitia cum voluptate conectitur. nam et laetamur 789 | amicorum laetitia aeque atque nostra et pariter dolemus angoribus. 790 | 791 | Quocirca eodem modo sapiens erit affectus erga amicum, quo in se 792 | ipsum, quosque labores propter suam voluptatem susciperet, eosdem 793 | suscipiet propter amici voluptatem. quaeque de virtutibus dicta sunt, 794 | quem ad modum eae semper voluptatibus inhaererent, eadem de amicitia 795 | dicenda sunt. praeclare enim Epicurus his paene verbis: 'Eadem', 796 | inquit, 'scientia confirmavit animum, ne quod aut sempiternum aut 797 | diuturnum timeret malum, quae perspexit in hoc ipso vitae spatio 798 | amicitiae praesidium esse firmissimum.' 799 | 800 | Sunt autem quidam Epicurei timidiores paulo contra vestra convicia, 801 | sed tamen satis acuti, qui verentur ne, si amicitiam propter nostram 802 | voluptatem expetendam putemus, tota amicitia quasi claudicare 803 | videatur. itaque primos congressus copulationesque et consuetudinum 804 | instituendarum voluntates fieri propter voluptatem; cum autem usus 805 | progrediens familiaritatem effecerit, tum amorem efflorescere tantum, 806 | ut, etiamsi nulla sit utilitas ex amicitia, tamen ipsi amici propter 807 | se ipsos amentur. etenim si loca, si fana, si urbes, si gymnasia, si 808 | campum, si canes, si equos, si ludicra exercendi aut venandi 809 | consuetudine adamare solemus, quanto id in hominum consuetudine 810 | facilius fieri poterit et iustius? 811 | 812 | Sunt autem, qui dicant foedus esse quoddam sapientium, ut ne minus 813 | amicos quam se ipsos diligant. quod et posse fieri intellegimus et 814 | saepe etiam videmus, et perspicuum est nihil ad iucunde vivendum 815 | reperiri posse, quod coniunctione tali sit aptius. Quibus ex omnibus 816 | iudicari potest non modo non impediri rationem amicitiae, si summum 817 | bonum in voluptate ponatur, sed sine hoc institutionem omnino 818 | amicitiae non posse reperiri. 819 | 820 | Quapropter si ea, quae dixi, sole ipso illustriora et clariora sunt, 821 | si omnia dixi hausta e fonte naturae, si tota oratio nostra omnem sibi 822 | fidem sensibus confirmat, id est incorruptis atque integris testibus, 823 | si infantes pueri, mutae etiam bestiae paene loquuntur magistra ac 824 | duce natura nihil esse prosperum nisi voluptatem, nihil asperum nisi 825 | dolorem, de quibus neque depravate iudicant neque corrupte, nonne ei 826 | maximam gratiam habere debemus, qui hac exaudita quasi voce naturae 827 | sic eam firme graviterque comprehenderit, ut omnes bene sanos in viam 828 | placatae, tranquillae, quietae, beatae vitae deduceret? Qui quod tibi 829 | parum videtur eruditus, ea causa est, quod nullam eruditionem esse 830 | duxit, nisi quae beatae vitae disciplinam iuvaret. 831 | 832 | An ille tempus aut in poetis evolvendis, ut ego et Triarius te 833 | hortatore facimus, consumeret, in quibus nulla solida utilitas 834 | omnisque puerilis est delectatio, aut se, ut Plato, in musicis, 835 | geometria, numeris, astris contereret, quae et a falsis initiis 836 | profecta vera esse non possunt et, si essent vera, nihil afferrent, 837 | quo iucundius, id est quo melius viveremus, eas ergo artes 838 | persequeretur, vivendi artem tantam tamque et operosam et perinde 839 | fructuosam relinqueret? non ergo Epicurus ineruditus, sed ii indocti, 840 | qui, quae pueros non didicisse turpe est, ea putant usque ad 841 | senectutem esse discenda. 842 | 843 | Quae cum dixisset, Explicavi, inquit, sententiam meam, et eo quidem 844 | consilio, tuum iudicium ut cognoscerem, quoniam mihi ea facultas, ut 845 | id meo arbitratu facerem, ante hoc tempus numquam est data. 846 | -------------------------------------------------------------------------------- /src/lorem-ipsum.txt: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do 2 | eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad 3 | minim veniam, quis nostrud exercitation ullamco laboris nisi ut 4 | aliquip ex ea commodo consequat. Duis aute irure dolor in 5 | reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla 6 | pariatur. Excepteur sint occaecat cupidatat non proident, sunt in 7 | culpa qui officia deserunt mollit anim id est laborum. 8 | -------------------------------------------------------------------------------- /tests/version-numbers.rs: -------------------------------------------------------------------------------- 1 | #[test] 2 | fn test_readme_deps() { 3 | version_sync::assert_markdown_deps_updated!("README.md"); 4 | } 5 | 6 | #[test] 7 | fn test_readme_changelog() { 8 | version_sync::assert_contains_regex!( 9 | "README.md", 10 | r"^### Version {version} \(20\d\d-\d\d-\d\d\)" 11 | ); 12 | } 13 | 14 | #[test] 15 | fn test_html_root_url() { 16 | version_sync::assert_html_root_url_updated!("src/lib.rs"); 17 | } 18 | --------------------------------------------------------------------------------