diff options
64 files changed, 17979 insertions, 2 deletions
diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.am b/Build/source/texk/texlive/linked_scripts/Makefile.am index 9e510528046..912b6d626e8 100644 --- a/Build/source/texk/texlive/linked_scripts/Makefile.am +++ b/Build/source/texk/texlive/linked_scripts/Makefile.am @@ -54,6 +54,7 @@ texmf_shell_scripts = \ dtxgen/dtxgen \ installfont/installfont-tl \ latexfileversion/latexfileversion \ + latexindent/latexindent.pl \ listbib/listbib \ listings-ext/listings-ext.sh \ ltxfileinfo/ltxfileinfo \ diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.in b/Build/source/texk/texlive/linked_scripts/Makefile.in index 3ca216c90c0..c27dcc42e2c 100644 --- a/Build/source/texk/texlive/linked_scripts/Makefile.in +++ b/Build/source/texk/texlive/linked_scripts/Makefile.in @@ -258,6 +258,7 @@ texmf_shell_scripts = \ dtxgen/dtxgen \ installfont/installfont-tl \ latexfileversion/latexfileversion \ + latexindent/latexindent.pl \ listbib/listbib \ listings-ext/listings-ext.sh \ ltxfileinfo/ltxfileinfo \ diff --git a/Build/source/texk/texlive/linked_scripts/latexindent/latexindent.pl b/Build/source/texk/texlive/linked_scripts/latexindent/latexindent.pl new file mode 100755 index 00000000000..74ab7ebb3e5 --- /dev/null +++ b/Build/source/texk/texlive/linked_scripts/latexindent/latexindent.pl @@ -0,0 +1,1784 @@ +#!/usr/bin/perl +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# See http://www.gnu.org/licenses/. +# +# For details of how to use this file, please see readme.txt + +# load packages/modules +use strict; +use warnings; +use FindBin; # help find defaultSettings.yaml +use YAML::Tiny; # interpret defaultSettings.yaml +use File::Copy; # to copy the original file to backup (if overwrite option set) +use File::Basename; # to get the filename and directory path +#use Getopt::Std; +use Getopt::Long; # to get the switches/options/flags +use File::HomeDir; # to get users home directory, regardless of OS + +# get the options +my $overwrite; +my $outputToFile; +my $silentMode; +my $tracingMode; +my $readLocalSettings; +my $onlyDefault; +my $showhelp; +my $cruftDirectory='./'; + +GetOptions ("w"=>\$overwrite, +"o"=>\$outputToFile, +"s"=>\$silentMode, +"t"=>\$tracingMode, +"l"=>\$readLocalSettings, +"d"=>\$onlyDefault, +"h"=>\$showhelp, +"c=s"=>\$cruftDirectory, +); + +die "Could not find directory $cruftDirectory\nExiting, no indentation done." if(!(-d $cruftDirectory)); + +# version number +my $versionNumber = "1.1R"; + +# Check the number of input arguments- if it is 0 then simply +# display the list of options (like a manual) +if(scalar(@ARGV) < 1 or $showhelp) +{ + print <<ENDQUOTE +latexindent.pl version $versionNumber +usage: latexindent.pl [options] [file][.tex] + -h help (see the documentation for detailed instructions and examples) + -o output to another file; sample usage + latexindent.pl -o myfile.tex outputfile.tex + -w overwrite the current file- a backup will be made, but still be careful + -s silent mode- no output will be given to the terminal + -t tracing mode- verbose information given to the log file + -l use localSettings.yaml (assuming it exists in the directory of your file) + -d ONLY use defaultSettings.yaml, ignore ALL user files + -c=cruft directory used to specify the location of backup files and indent.log +ENDQUOTE + ; + exit(2); +} + + +# we'll be outputting to the logfile and to standard output +my $logfile; +my $out = *STDOUT; + +# open the log file +open($logfile,">","$cruftDirectory/indent.log") or die "Can't open indent.log"; + +# output time to log file +my $time = localtime(); +print $logfile $time; + +# output version to log file +print $logfile <<ENDQUOTE + +latexindent.pl version $versionNumber, a script to indent .tex files +latexindent.pl lives here: $FindBin::RealBin/ + +Directory for backup files and indent.log: $cruftDirectory + +file: $ARGV[0] +ENDQUOTE +; + +# a quick options check +if($outputToFile and $overwrite) +{ + print $logfile <<ENDQUOTE + +WARNING: +\t You have called latexindent.pl with both -o and -w +\t -o (output to file) will take priority, and -w (over write) will be ignored + +ENDQUOTE +; + $overwrite = 0; +} + +# can't call the script with MORE THAN 2 files +if(scalar(@ARGV)>2) +{ + for my $fh ($out,$logfile) {print $fh <<ENDQUOTE + +ERROR: +\t You're calling latexindent.pl with more than two file names +\t The script can take at MOST two file names, but you +\t need to call it with the -o switch; for example + +\t latexindent.pl -o originalfile.tex outputfile.tex + +No indentation done :( +Exiting... +ENDQUOTE + }; + exit(2); +} + +# don't call the script with 2 files unless the -o flag is active +if(!$outputToFile and scalar(@ARGV)==2) +{ +for my $fh ($out,$logfile) { +print $fh <<ENDQUOTE + +ERROR: +\t You're calling latexindent.pl with two file names, but not the -o flag. +\t Did you mean to use the -o flag ? + +No indentation done :( +Exiting... +ENDQUOTE +}; + exit(2); +} + +# if the script is called with the -o switch, then check that +# a second file is present in the call, e.g +# latexindent.pl -o myfile.tex output.tex +if($outputToFile and scalar(@ARGV)==1) +{ + for my $fh ($out,$logfile) {print $fh <<ENDQUOTE +ERROR: When using the -o flag you need to call latexindent.pl with 2 arguments + +latexindent.pl -o "$ARGV[0]" [needs another name here] + +No indentation done :( +Exiting... +ENDQUOTE +}; + exit(2); +} + + +# Read in YAML file +my $defaultSettings = YAML::Tiny->new; + +print $logfile "Reading defaultSettings.yaml from $FindBin::Bin/defaultSettings.yaml\n\n"; + +# Open defaultSettings.yaml +$defaultSettings = YAML::Tiny->read( "$FindBin::Bin/defaultSettings.yaml" ); + +if(!$defaultSettings) +{ + for my $fh ($out,$logfile) { + print $fh <<ENDQUOTE + ERROR There seems to be a yaml formatting error in defaultSettings.yaml + Please check it for mistakes- you can find a working version at https://github.com/cmhughes/latexindent.plx + if you would like to overwrite your current version + + Exiting, no indendation done. +ENDQUOTE +}; + exit(2); +} + +# setup the DEFAULT variables and hashes from the YAML file + +# scalar variables +my $defaultIndent = $defaultSettings->[0]->{defaultIndent}; +my $alwaysLookforSplitBraces = $defaultSettings->[0]->{alwaysLookforSplitBraces}; +my $alwaysLookforSplitBrackets = $defaultSettings->[0]->{alwaysLookforSplitBrackets}; +my $backupExtension = $defaultSettings->[0]->{backupExtension}; +my $indentPreamble = $defaultSettings->[0]->{indentPreamble}; +my $onlyOneBackUp = $defaultSettings->[0]->{onlyOneBackUp}; +my $maxNumberOfBackUps = $defaultSettings->[0]->{maxNumberOfBackUps}; +my $removeTrailingWhitespace = $defaultSettings->[0]->{removeTrailingWhitespace}; + +# hash variables +my %lookForAlignDelims= %{$defaultSettings->[0]->{lookForAlignDelims}}; +my %indentRules= %{$defaultSettings->[0]->{indentRules}}; +my %verbatimEnvironments= %{$defaultSettings->[0]->{verbatimEnvironments}}; +my %noIndentBlock= %{$defaultSettings->[0]->{noIndentBlock}}; +my %checkunmatched= %{$defaultSettings->[0]->{checkunmatched}}; +my %checkunmatchedELSE= %{$defaultSettings->[0]->{checkunmatchedELSE}}; +my %checkunmatchedbracket= %{$defaultSettings->[0]->{checkunmatchedbracket}}; +my %noAdditionalIndent= %{$defaultSettings->[0]->{noAdditionalIndent}}; +my %indentAfterHeadings= %{$defaultSettings->[0]->{indentAfterHeadings}}; + +# need new hashes to store the user and local data before +# overwriting the default +my %lookForAlignDelimsUSER; +my %indentRulesUSER; +my %verbatimEnvironmentsUSER; +my %noIndentBlockUSER; +my %checkunmatchedUSER; +my %checkunmatchedELSEUSER; +my %checkunmatchedbracketUSER; +my %noAdditionalIndentUSER; +my %indentAfterHeadingsUSER; + +# for printing the user and local settings to the log file +my %dataDump; + +# empty array to store the paths +my @absPaths; + +# scalar to read user settings +my $userSettings; + +# get information about user settings- first check if indentconfig.yaml exists +my $indentconfig = File::HomeDir->my_home . "/indentconfig.yaml"; +if ( -e $indentconfig and !$onlyDefault ) +{ + print $logfile "Reading path information from ",File::HomeDir->my_home,"/indentconfig.yaml\n"; + + # read the absolute paths from indentconfig.yaml + $userSettings = YAML::Tiny->read( "$indentconfig" ); + + # integrity check + if($userSettings) + { + %dataDump = %{$userSettings->[0]}; + print $logfile Dump \%dataDump; + print $logfile "\n"; + @absPaths = @{$userSettings->[0]->{paths}}; + } + else + { + print $logfile <<ENDQUOTE +WARNING: $indentconfig + contains some invalid .yaml formatting- unable to read from it. + No user settings loaded. +ENDQUOTE +; + } +} +else +{ + if($onlyDefault) + { + print $logfile "Only default settings requested, not reading USER settings from indentconfig.yaml \n"; + print $logfile "Ignoring localSettings.yaml\n" if($readLocalSettings); + $readLocalSettings = 0; + } + else + { + # give the user instructions on where to put indentconfig.yaml + print $logfile "Home directory is ",File::HomeDir->my_home,"\n"; + print $logfile "To specify user settings you would put indentconfig.yaml here: \n\t",File::HomeDir->my_home,"/indentconfig.yaml\n\n"; + } +} + +# get information about LOCAL settings, assuming that localSettings.yaml exists +my $directoryName = dirname $ARGV[0]; + +# add local settings to the paths, if appropriate +if ( (-e "$directoryName/localSettings.yaml") and $readLocalSettings and !(-z "$directoryName/localSettings.yaml")) +{ + print $logfile "\nAdding ./localSettings.yaml to paths\n\n"; + push(@absPaths,"$directoryName/localSettings.yaml"); +} +elsif ( !(-e "$directoryName/localSettings.yaml") and $readLocalSettings) +{ + print $logfile "WARNING\n\t$directoryName/localSettings.yaml not found\n"; + print $logfile "\tcarrying on without it.\n"; +} + +# read in the settings from each file +foreach my $settings (@absPaths) +{ + # check that the settings file exists and that it isn't empty + if (-e $settings and !(-z $settings)) + { + print $logfile "Reading USER settings from $settings\n"; + $userSettings = YAML::Tiny->read( "$settings" ); + + # if we can read userSettings + if($userSettings) + { + # output settings to $logfile + %dataDump = %{$userSettings->[0]}; + print $logfile Dump \%dataDump; + print $logfile "\n"; + + # scalar variables + $defaultIndent = $userSettings->[0]->{defaultIndent} if defined($userSettings->[0]->{defaultIndent}); + $alwaysLookforSplitBraces = $userSettings->[0]->{alwaysLookforSplitBraces} if defined($userSettings->[0]->{alwaysLookforSplitBraces}); + $alwaysLookforSplitBrackets = $userSettings->[0]->{alwaysLookforSplitBrackets} if defined($userSettings->[0]->{alwaysLookforSplitBrackets}); + $backupExtension = $userSettings->[0]->{backupExtension} if defined($userSettings->[0]->{backupExtension}); + $indentPreamble = $userSettings->[0]->{indentPreamble} if defined($userSettings->[0]->{indentPreamble}); + $onlyOneBackUp = $userSettings->[0]->{onlyOneBackUp} if defined($userSettings->[0]->{onlyOneBackUp}); + $maxNumberOfBackUps = $userSettings->[0]->{maxNumberOfBackUps} if defined($userSettings->[0]->{maxNumberOfBackUps}); + $removeTrailingWhitespace = $userSettings->[0]->{removeTrailingWhitespace} if defined($userSettings->[0]->{removeTrailingWhitespace}); + + # hash variables - note that each one requires two lines, + # one to read in the data, one to put the keys&values in correctly + + %lookForAlignDelimsUSER= %{$userSettings->[0]->{lookForAlignDelims}} if defined($userSettings->[0]->{lookForAlignDelims}); + @lookForAlignDelims{ keys %lookForAlignDelimsUSER } = values %lookForAlignDelimsUSER if (%lookForAlignDelimsUSER); + + %indentRulesUSER= %{$userSettings->[0]->{indentRules}} if defined($userSettings->[0]->{indentRules}); + @indentRules{ keys %indentRulesUSER } = values %indentRulesUSER if (%indentRulesUSER); + + %verbatimEnvironmentsUSER= %{$userSettings->[0]->{verbatimEnvironments}} if defined($userSettings->[0]->{verbatimEnvironments}); + @verbatimEnvironments{ keys %verbatimEnvironmentsUSER } = values %verbatimEnvironmentsUSER if (%verbatimEnvironmentsUSER); + + %noIndentBlockUSER= %{$userSettings->[0]->{noIndentBlock}} if defined($userSettings->[0]->{noIndentBlock}); + @noIndentBlock{ keys %noIndentBlockUSER } = values %noIndentBlockUSER if (%noIndentBlockUSER); + + %checkunmatchedUSER= %{$userSettings->[0]->{checkunmatched}} if defined($userSettings->[0]->{checkunmatched}); + @checkunmatched{ keys %checkunmatchedUSER } = values %checkunmatchedUSER if (%checkunmatchedUSER); + + %checkunmatchedbracketUSER= %{$userSettings->[0]->{checkunmatchedbracket}} if defined($userSettings->[0]->{checkunmatchedbracket}); + @checkunmatchedbracket{ keys %checkunmatchedbracketUSER } = values %checkunmatchedbracketUSER if (%checkunmatchedbracketUSER); + + %noAdditionalIndentUSER= %{$userSettings->[0]->{noAdditionalIndent}} if defined($userSettings->[0]->{noAdditionalIndent}); + @noAdditionalIndent{ keys %noAdditionalIndentUSER } = values %noAdditionalIndentUSER if (%noAdditionalIndentUSER); + + %indentAfterHeadingsUSER= %{$userSettings->[0]->{indentAfterHeadings}} if defined($userSettings->[0]->{indentAfterHeadings}); + @indentAfterHeadings{ keys %indentAfterHeadingsUSER } = values %indentAfterHeadingsUSER if (%indentAfterHeadingsUSER); + + } + else + { + # otherwise print a warning that we can not read userSettings.yaml + print $logfile "WARNING\n\t$settings \n\t contains invalid yaml format- not reading from it\n"; + } + + } + else + { + # otherwise keep going, but put a warning in the log file + print $logfile "\nWARNING\n\t",File::HomeDir->my_home,"/indentconfig.yaml\n"; + if (-z $settings) + { + print $logfile "\tspecifies $settings \n\tbut this file is EMPTY- not reading from it\n\n" + } + else + { + print $logfile "\tspecifies $settings \n\tbut this file does not exist- unable to read settings from this file\n\n" + } + } +} + + +# if we want to over write the current file +# create a backup first +if ($overwrite) +{ + print $logfile "\nBackup procedure:\n"; + # original name of file + my $filename = $ARGV[0]; + # copy it + my $backupFile = $filename; + + # add the user's backup directory to the backup path + $backupFile = "$cruftDirectory/$backupFile"; + + # if both ($onlyOneBackUp and $maxNumberOfBackUps) then we have + # a conflict- er on the side of caution and turn off onlyOneBackUp + if($onlyOneBackUp and $maxNumberOfBackUps>1) + { + print $logfile "\t WARNING: onlyOneBackUp=$onlyOneBackUp and maxNumberOfBackUps: $maxNumberOfBackUps\n"; + print $logfile "\t\t setting onlyOneBackUp=0 which will allow you to reach $maxNumberOfBackUps back ups\n"; + $onlyOneBackUp = 0; + } + + # if the user has specified that $maxNumberOfBackUps = 1 then + # they only want one backup + if($maxNumberOfBackUps==1) + { + $onlyOneBackUp=1 ; + print $logfile "\t FYI: you set maxNumberOfBackUps=1, so I'm setting onlyOneBackUp: 1 \n"; + } + elsif($maxNumberOfBackUps<=0 and !$onlyOneBackUp) + { +# print $logfile "\t FYI: maxNumberOfBackUps=$maxNumberOfBackUps which won't have any effect\n"; +# print $logfile "\t on the script- at least ONE backup is made when the -w flag is invoked.\n"; +# print $logfile "\t I'm setting onlyOneBackUp: 0, which means that you'll get a new back up file \n"; +# print $logfile "\t every time you run the script.\n"; + $onlyOneBackUp=0 ; + $maxNumberOfBackUps=-1; + } + + # if onlyOneBackUp is set, then the backup file will + # be overwritten each time + if($onlyOneBackUp) + { + $backupFile =~ s/\.tex/$backupExtension/; + print $logfile "\t copying $filename to $backupFile\n"; + print $logfile "\t $backupFile was overwritten\n\n" if (-e $backupFile); + } + else + { + # start with a backup file .bak0 (or whatever $backupExtension is present) + my $backupCounter = 0; + $backupFile =~ s/\.tex$/$backupExtension$backupCounter/; + + # if it exists, then keep going: .bak0, .bak1, ... + while (-e $backupFile or $maxNumberOfBackUps>1) + { + if($backupCounter==$maxNumberOfBackUps) + { + print $logfile "\t maxNumberOfBackUps reached ($maxNumberOfBackUps)\n"; + $maxNumberOfBackUps=1 ; + last; # break out of the loop + } + elsif(!(-e $backupFile)) + { + $maxNumberOfBackUps=1 ; + last; # break out of the loop + } + print $logfile "\t $backupFile already exists, incrementing by 1...\n"; + $backupCounter++; + $backupFile =~ s/$backupExtension.*/$backupExtension$backupCounter/; + } + print $logfile "\n\t copying $filename to $backupFile\n\n"; + } + + # output these lines to the log file + print $logfile "\t Backup file: ",$backupFile,"\n"; + print $logfile "\t Overwriting file: ",$filename,"\n\n"; + copy($filename,$backupFile) or die "Could not write to backup file $backupFile. Please check permissions. Exiting.\n"; +} + +if(!($outputToFile or $overwrite)) +{ + print $logfile "Just out put to the terminal :)\n\n" if !$silentMode ; +} + + +# scalar variables +my $line; # $line: takes the $line of the file +my $inpreamble=!$indentPreamble; + # $inpreamble: switch to determine if in + # preamble or not +my $inverbatim=0; # $inverbatim: switch to determine if in + # a verbatim environment or not +my $delimiters=0; # $delimiters: switch that governs if + # we need to check for & or not +my $matchedbraces=0; # $matchedbraces: counter to see if { } + # are matched; it will be + # positive if too many { + # negative if too many } + # 0 if matched +my $matchedBRACKETS=0; # $matchedBRACKETS: counter to see if [ ] + # are matched; it will be + # positive if too many { + # negative if too many } + # 0 if matched +my $commandname; # $commandname: either \parbox, \marginpar, + # or anything else from %checkunmatched +my $commanddetails; # $command details: a scalar that stores + # details about the command + # that splits {} across lines +my $countzeros; # $countzeros: a counter that helps + # when determining if we're in + # an else construct +my $lookforelse=0; # $lookforelse: a boolean to help determine + # if we need to look for an + # else construct +my $trailingcomments; # $trailingcomments stores the comments at the end of + # a line +my $lineCounter=0; # $lineCounter keeps track of the line number +my $inIndentBlock=0; # $inindentblock: switch to determine if in + # a inindentblock or not +my $headingLevel=0; # $headingLevel: scalar that stores which heading + # we are under: \part, \chapter, etc + +# array variables +my @indent; # @indent: stores current level of indentation +my @lines; # @lines: stores the newly indented lines +my @block; # @block: stores blocks that have & delimiters +my @commandstore; # @commandstore: stores commands that + # have split {} across lines +my @commandstorebrackets; # @commandstorebrackets: stores commands that + # have split [] across lines +my @mainfile; # @mainfile: stores input file; used to + # grep for \documentclass +my @headingStore; # @headingStore: stores headings: chapter, section, etc +my @indentNames; # @indentNames: keeps names of commands and + # environments that have caused + # indentation to increase +my @environmentStack; # @environmentStack: stores the (nested) names + # of environments + +# check to see if the current file has \documentclass, if so, then +# it's the main file, if not, then it doesn't have preamble +open(MAINFILE, $ARGV[0]) or die "Could not open input file"; + @mainfile=<MAINFILE>; +close(MAINFILE); + +# if the MAINFILE doesn't have a \documentclass statement, then +# it shouldn't have preamble +if(scalar(@{[grep(m/^\s*\\documentclass/, @mainfile)]})==0) +{ + $inpreamble=0; + + print $logfile "Trace:\tNo documentclass detected, assuming no preamble\n" if($tracingMode); +} +else +{ + print $logfile "Trace:\t documentclass detected, assuming preamble\n" if($tracingMode); +} + +# the previous OPEN command puts us at the END of the file +open(MAINFILE, $ARGV[0]) or die "Could not open input file"; + +# loop through the lines in the INPUT file +while(<MAINFILE>) +{ + # increment the line counter + $lineCounter++; + + # tracing mode + print $logfile "\n" if($tracingMode and !($inpreamble or $inverbatim or $inIndentBlock)); + + # check to see if we're still in the preamble + # or in a verbatim environment or in IndentBlock + if(!($inpreamble or $inverbatim or $inIndentBlock)) + { + # if not, remove all leading spaces and tabs + # from the current line, assuming it isn't empty + #s/^\ *//; + #s/^\s+//; + #s/^\t+//; + s/^\t*// if($_ !~ /^((\s*)|(\t*))*$/); + s/^\s*// if($_ !~ /^((\s*)|(\t*))*$/); + + # tracing mode + print $logfile "Line $lineCounter\t removing leading spaces\n" if($tracingMode); + } + else + { + # otherwise check to see if we've reached the main + # part of the document + if(m/^\s*\\begin{document}/) + { + $inpreamble = 0; + + # tracing mode + print $logfile "Line $lineCounter\t \\begin{document} found \n" if($tracingMode); + } + else + { + # tracing mode + if($inpreamble) + { + print $logfile "Line $lineCounter\t still in PREAMBLE, doing nothing\n" if($tracingMode); + } + elsif($inverbatim) + { + print $logfile "Line $lineCounter\t in VERBATIM-LIKE environment, doing nothing\n" if($tracingMode); + } + elsif($inIndentBlock) + { + print $logfile "Line $lineCounter\t in NO INDENT BLOCK, doing nothing\n" if($tracingMode); + } + } + } + + # check to see if we have \end{something} or \] + &at_end_of_env_or_eq() unless ($inpreamble or $inIndentBlock); + + # check to see if we're at the end of a noindent + # block %\end{noindent} + &at_end_noindent(); + + # only check for unmatched braces if we're not in + # a verbatim-like environment or in the preamble or in a + # noIndentBlock + if(!($inverbatim or $inpreamble or $inIndentBlock)) + { + # The check for closing } and ] relies on counting, so + # we have to remove trailing comments so that any {, }, [, ] + # that are found after % are not counted + # + # note that these lines are NOT in @lines, so we + # have to store the $trailingcomments to put + # back on after the counting + # + # note the use of (?<!\\)% so that we don't match \% + if ( $_=~ m/(?<!\\)%.*/) + { + s/((?<!\\)%.*)//; + $trailingcomments=$1; + + # tracing mode + print $logfile "Line $lineCounter\t Removed trailing comments to count braces and brackets: $1\n" if($tracingMode); + } + + # check to see if we're at the end of a \parbox, \marginpar + # or other split-across-lines command and check that + # we're not starting another command that has split braces (nesting) + &end_command_or_key_unmatched_braces(); + + # check to see if we're at the end of a command that splits + # [ ] across lines + &end_command_or_key_unmatched_brackets(); + + # check for a heading + &indent_heading(); + + # add the trailing comments back to the end of the line + if(scalar($trailingcomments)) + { + # some line break magic, http://stackoverflow.com/questions/881779/neatest-way-to-remove-linebreaks-in-perl + s/\R//; + $_ = $_ . $trailingcomments."\n" ; + + # tracing mode + print $logfile "Line $lineCounter\t counting braces/brackets complete: added trailing comments back on $trailingcomments\n" if($tracingMode); + + # empty the trailingcomments + $trailingcomments=''; + + } + } + + # remove trailing whitespace + if ($removeTrailingWhitespace) + { + print $logfile "Line $lineCounter\t removing trailing whitespace\n" if ($tracingMode); + s/\s+$/\n/; + } + + # ADD CURRENT LEVEL OF INDENTATION + # (unless we're in a delimiter-aligned block) + if(!$delimiters) + { + # make sure we're not in a verbatim block or in the preamble + if($inverbatim or $inpreamble or $inIndentBlock) + { + # just push the current line as is + push(@lines,$_); + } + else + { + # add current value of indentation to the current line + # and output it + # unless this would only create trailing whitespace and the + # corresponding option is set + unless ($_ =~ m/^$/ and $removeTrailingWhitespace){ + $_ = join("",@indent).$_; + } + push(@lines,$_); + # tracing mode + print $logfile "Line $lineCounter\t Adding current level of indentation: ",join(", ",@indentNames),"\n" if($tracingMode); + } + } + else + { + # output to @block if we're in a delimiter block + push(@block,$_); + + # tracing mode + print $logfile "Line $lineCounter\t In delimeter block, waiting for block formatting\n" if($tracingMode); + } + + # only check for new environments or commands if we're + # not in a verbatim-like environment or in the preamble + # or in a noIndentBlock, or delimiter block + if(!($inverbatim or $inpreamble or $inIndentBlock or $delimiters)) + { + + # check if we are in a + # % \begin{noindent} + # block; this is similar to a verbatim block, the user + # may not want some blocks of code to be touched + # + # IMPORTANT: this needs to go before the trailing comments + # are removed! + &at_beg_noindent(); + + # remove trailing comments so that any {, }, [, ] + # that are found after % are not counted + # + # note that these lines are already in @lines, so we + # can remove the trailing comments WITHOUT having + # to put them back in + # + # Note that this won't match \% + s/(?<!\\)%.*// if( $_=~ m/(?<!\\)%.*/); + + # tracing mode + print $logfile "Line $lineCounter\t Removing trailing comments for brace count (line is already stored)\n" if($tracingMode); + + # check to see if we have \begin{something} or \[ + &at_beg_of_env_or_eq(); + + # check to see if we have \parbox, \marginpar, or + # something similar that might split braces {} across lines, + # specified in %checkunmatched hash table + &start_command_or_key_unmatched_braces(); + + # check for an else statement + &check_for_else(); + + # check for a command that splits [] across lines + &start_command_or_key_unmatched_brackets(); + + # check for a heading + &indent_after_heading(); + + # tracing mode + print $logfile "Line $lineCounter\t Environments: ",join(", ",@environmentStack),"\n" if($tracingMode and scalar(@environmentStack)); + } +} + +# close the main file +close(MAINFILE); + +# put line count information in the log file +print $logfile "Line Count of $ARGV[0]: ",scalar(@mainfile),"\n"; +print $logfile "Line Count of indented $ARGV[0]: ",scalar(@lines); +if(scalar(@mainfile) != scalar(@lines)) +{ + print $logfile <<ENDQUOTE +WARNING: \t line count of original file and indented file does +\t not match- consider reverting to a back up, see $backupExtension; +ENDQUOTE +; +} +else +{ + print $logfile "\n\nLine counts of original file and indented file match"; +} + +# output the formatted lines to the terminal +print @lines if(!$silentMode); + +# if -w is active then output to $ARGV[0] +if($overwrite) +{ + open(OUTPUTFILE,">",$ARGV[0]); + print OUTPUTFILE @lines; + close(OUTPUTFILE); +} + +# if -o is active then output to $ARGV[1] +if($outputToFile) +{ + open(OUTPUTFILE,">",$ARGV[1]); + print OUTPUTFILE @lines; + close(OUTPUTFILE); +} + +# close the log file +close($logfile); + +exit; + +sub indent_heading{ + # PURPOSE: This matches + # \part + # \chapter + # \section + # \subsection + # \subsubsection + # \paragraph + # \subparagraph + # + # and anything else listed in indentAfterHeadings + # + # This subroutine specifies the indentation for the + # heading itself, i.e the line that has \chapter, \section etc + if( $_ =~ m/^\s*\\(.*?)(\[|{)/ and $indentAfterHeadings{$1}) + { + # tracing mode + print $logfile "Line $lineCounter\t Heading found: $1 \n" if($tracingMode); + + # get the heading settings- it's a hash within a hash + my %currentHeading = %{$indentAfterHeadings{$1}}; + + # local scalar + my $previousHeadingLevel = $headingLevel; + + # if current heading level < old heading level, + if($currentHeading{level}<$previousHeadingLevel) + { + # decrease indentation, but only if + # specified in indentHeadings. Note that this check + # needs to be done here- decrease_indent won't + # check a nested hash + + if(scalar(@headingStore)) + { + while($currentHeading{level}<$previousHeadingLevel and scalar(@headingStore)) + { + my $higherHeadingName = pop(@headingStore); + my %higherLevelHeading = %{$indentAfterHeadings{$higherHeadingName}}; + + # tracing mode + print $logfile "Line $lineCounter\t stepping UP heading level from $higherHeadingName \n" if($tracingMode); + + &decrease_indent($higherHeadingName) if($higherLevelHeading{indent}); + $previousHeadingLevel=$higherLevelHeading{level}; + } + # put the heading name back in to storage + push(@headingStore,$1); + } + } + elsif($currentHeading{level}==$previousHeadingLevel) + { + if(scalar(@headingStore)) + { + my $higherHeadingName = pop(@headingStore); + my %higherLevelHeading = %{$indentAfterHeadings{$higherHeadingName}}; + &decrease_indent($higherHeadingName) if($higherLevelHeading{indent}); + } + # put the heading name back in to storage + push(@headingStore,$1); + } + else + { + # put the heading name into storage + push(@headingStore,$1); + } + } +} + +sub indent_after_heading{ + # PURPOSE: This matches + # \part + # \chapter + # \section + # \subsection + # \subsubsection + # \paragraph + # \subparagraph + # + # and anything else listed in indentAfterHeadings + # + # This subroutine is specifies the indentation for + # the text AFTER the heading, i.e the body of conent + # in each \chapter, \section, etc + if( $_ =~ m/^\s*\\(.*?)(\[|{)/ and $indentAfterHeadings{$1}) + { + # get the heading settings- it's a hash within a hash + my %currentHeading = %{$indentAfterHeadings{$1}}; + + &increase_indent($1) if($currentHeading{indent}); + + # update heading level + $headingLevel = $currentHeading{level}; + } +} + + + +sub at_end_noindent{ + # PURPOSE: This matches + # % \end{noindent} + # with any number of spaces (possibly none) between + # the comment and \end{noindent}. + # + # the comment symbol IS indended! + # + # This is for blocks of code that the user wants + # to leave untouched- similar to verbatim blocks + + if( $_ =~ m/^%\s*\\end{(.*?)}/ and $noIndentBlock{$1}) + { + $inIndentBlock=0; + # tracing mode + print $logfile "Line $lineCounter\t % \\end{no indent block} found, switching inIndentBlock OFF \n" if($tracingMode); + } +} + +sub at_beg_noindent{ + # PURPOSE: This matches + # % \begin{noindent} + # with any number of spaces (possibly none) between + # the comment and \begin{noindent}. + # + # the comment symbol IS indended! + # + # This is for blocks of code that the user wants + # to leave untouched- similar to verbatim blocks + + if( $_ =~ m/^%\s*\\begin{(.*?)}/ and $noIndentBlock{$1}) + { + $inIndentBlock = 1; + # tracing mode + print $logfile "Line $lineCounter\t % \\begin{no indent block} found, switching inIndentBlock ON \n" if($tracingMode); + } +} + +sub start_command_or_key_unmatched_brackets{ + # PURPOSE: This matches + # \pgfplotstablecreatecol[... + # + # or any other command/key that has brackets [ ] + # split across lines specified in the + # hash tables, %checkunmatchedbracket + # + # How to read: ^\s*(\\)?(.*?)(\[\s*) + # + # ^ line begins with + # \s* any (or no)spaces + # (\\)? matches a \ backslash but not necessarily + # (.*?) non-greedy character match and store the result + # ((?<!\\)\[\s*) match [ possibly leading with spaces + # but it WON'T match \[ + + if ($_ =~ m/^\s*(\\)?(.*?)(\s*(?<!\\)\[)/ + and (scalar($checkunmatchedbracket{$2}) + or $alwaysLookforSplitBrackets) + ) + { + # store the command name, because $2 + # will not exist after the next match + $commandname = $2; + $matchedBRACKETS=0; + + # match [ but don't match \[ + $matchedBRACKETS++ while ($_ =~ /(?<!\\)\[/g); + # match ] but don't match \] + $matchedBRACKETS-- while ($_ =~ /(?<!\\)\]/g); + + # set the indentation + if($matchedBRACKETS != 0 ) + { + # tracing mode + print $logfile "Line $lineCounter\t Found opening BRACKET [ $commandname\n" if($tracingMode); + + &increase_indent($commandname); + + # store the command name + # and the value of $matchedBRACKETS + push(@commandstorebrackets,{commandname=>$commandname, + matchedBRACKETS=>$matchedBRACKETS}); + + } + } +} + +sub end_command_or_key_unmatched_brackets{ + # PURPOSE: Check for the closing BRACKET of a command that + # splits its BRACKETS across lines, such as + # + # \pgfplotstablecreatecol[ ... + # + # It works by checking if we have any entries + # in the array @commandstorebrackets, and making + # sure that we're not starting another command/key + # that has split BRACKETS (nesting). + # + # It also checks that the line is not commented. + # + # We count the number of [ and ADD to the counter + # ] and SUBTRACT to the counter + if(scalar(@commandstorebrackets) + and !($_ =~ m/^\s*(\\)?(.*?)(\s*\[)/ + and (scalar($checkunmatchedbracket{$2}) + or $alwaysLookforSplitBrackets)) + and $_ !~ m/^\s*%/ + ) + { + # get the details of the most recent command name + $commanddetails = pop(@commandstorebrackets); + $commandname = $commanddetails->{'commandname'}; + $matchedBRACKETS = $commanddetails->{'matchedBRACKETS'}; + + # match [ but don't match \[ + $matchedBRACKETS++ while ($_ =~ m/(?<!\\)\[/g); + + # match ] but don't match \] + $matchedBRACKETS-- while ($_ =~ m/(?<!\\)\]/g); + + # if we've matched up the BRACKETS then + # we can decrease the indent by 1 level + if($matchedBRACKETS == 0) + { + # tracing mode + print $logfile "Line $lineCounter\t Found closing BRACKET ] $commandname\n" if($tracingMode); + + # decrease the indentation (if appropriate) + &decrease_indent($commandname); + } + else + { + # otherwise we need to enter the new value + # of $matchedBRACKETS and the value of $command + # back into storage + push(@commandstorebrackets,{commandname=>$commandname, + matchedBRACKETS=>$matchedBRACKETS}); + # tracing mode + print $logfile "Line $lineCounter\t Searching for closing BRACKET ] $commandname\n" if($tracingMode); + } + } +} + +sub start_command_or_key_unmatched_braces{ + # PURPOSE: This matches + # \parbox{... + # \parbox[..]..{ + # empty header/.style={ + # \foreach \something + # etc + # + # or any other command/key that has BRACES + # split across lines specified in the + # hash tables, %checkunmatched, %checkunmatchedELSE + # + # How to read: ^\s*(\\)?(.*?)(\[|{|\s) + # + # ^ line begins with + # \s* any (or no) spaces + # (\\)? matches a \ backslash but not necessarily + # (.*?) non-greedy character match and store the result + # (\[|}|=|(\s*\\)) either [ or { or = or space \ + + if ($_ =~ m/^\s*(\\)?(.*?)(\[|{|=|(\s*\\))/ + and (scalar($checkunmatched{$2}) + or scalar($checkunmatchedELSE{$2}) + or $alwaysLookforSplitBraces) + ) + { + # store the command name, because $2 + # will not exist after the next match + $commandname = $2; + $matchedbraces=0; + + # by default, don't look for an else construct + $lookforelse=0; + if(scalar($checkunmatchedELSE{$2})) + { + $lookforelse=1; + } + + # match { but don't match \{ + $matchedbraces++ while ($_ =~ /(?<!\\){/g); + + # match } but don't match \} + $matchedbraces-- while ($_ =~ /(?<!\\)}/g); + + # tracing mode + print $logfile "Line $lineCounter\t matchedbraces = $matchedbraces\n" if($tracingMode); + + # set the indentation + if($matchedbraces > 0 ) + { + # tracing mode + print $logfile "Line $lineCounter\t Found opening BRACE { $commandname\n" if($tracingMode); + + &increase_indent($commandname); + + # store the command name + # and the value of $matchedbraces + push(@commandstore,{commandname=>$commandname, + matchedbraces=>$matchedbraces, + lookforelse=>$lookforelse, + countzeros=>0}); + + } + elsif($matchedbraces<0) + { + # if $matchedbraces < 0 then we must be matching + # braces from a previous split-braces command + + # keep matching { OR }, and don't match \{ or \} + while ($_ =~ m/(((?<!\\){)|((?<!\\)}))/g) + { + + # store the match, either { or } + my $braceType = $1; + + # get the details of the most recent command name + $commanddetails = pop(@commandstore); + $commandname = $commanddetails->{'commandname'}; + $matchedbraces = $commanddetails->{'matchedbraces'}; + $countzeros = $commanddetails->{'countzeros'}; + $lookforelse= $commanddetails->{'lookforelse'}; + + $matchedbraces++ if($1 eq "{"); + $matchedbraces-- if($1 eq "}"); + + # if we've matched up the braces then + # we can decrease the indent by 1 level + if($matchedbraces == 0) + { + $countzeros++ if $lookforelse; + + # tracing mode + print $logfile "Line $lineCounter\t Found closing BRACE } $1\n" if($tracingMode); + + # decrease the indentation (if appropriate) + &decrease_indent($commandname); + + if($countzeros==1) + { + push(@commandstore,{commandname=>$commandname, + matchedbraces=>$matchedbraces, + lookforelse=>$lookforelse, + countzeros=>$countzeros}); + } + } + else + { + # otherwise we need to put the command back for the + # next brace count + push(@commandstore,{commandname=>$commandname, + matchedbraces=>$matchedbraces, + lookforelse=>$lookforelse, + countzeros=>$countzeros}); + } + } + } + } +} + +sub end_command_or_key_unmatched_braces{ + # PURPOSE: Check for the closing BRACE of a command that + # splits its BRACES across lines, such as + # + # \parbox{ ... + # + # or one of the tikz keys, such as + # + # empty header/.style={ + # + # It works by checking if we have any entries + # in the array @commandstore, and making + # sure that we're not starting another command/key + # that has split BRACES (nesting). + # + # It also checks that the line is not commented. + # + # We count the number of { and ADD to the counter + # } and SUBTRACT to the counter + if(scalar(@commandstore) + and !($_ =~ m/^\s*(\\)?(.*?)(\[|{|=|(\s*\\))/ + and (scalar($checkunmatched{$2}) + or scalar($checkunmatchedELSE{$2}) + or $alwaysLookforSplitBraces)) + and $_ !~ m/^\s*%/ + ) + { + # keep matching { OR }, and don't match \{ or \} + while ($_ =~ m/(((?<!\\){)|((?<!\\)}))/g) + { + # store the match, either { or } + my $braceType = $1; + + # get the details of the most recent command name + $commanddetails = pop(@commandstore); + $commandname = $commanddetails->{'commandname'}; + $matchedbraces = $commanddetails->{'matchedbraces'}; + $countzeros = $commanddetails->{'countzeros'}; + $lookforelse= $commanddetails->{'lookforelse'}; + + $matchedbraces++ if($1 eq "{"); + $matchedbraces-- if($1 eq "}"); + + # if we've matched up the braces then + # we can decrease the indent by 1 level + if($matchedbraces == 0) + { + $countzeros++ if $lookforelse; + + # tracing mode + print $logfile "Line $lineCounter\t Found closing BRACE } $commandname\n" if($tracingMode); + + # decrease the indentation (if appropriate) + &decrease_indent($commandname); + + if($countzeros==1) + { + push(@commandstore,{commandname=>$commandname, + matchedbraces=>$matchedbraces, + lookforelse=>$lookforelse, + countzeros=>$countzeros}); + } + } + else + { + # otherwise we need to enter the new value + # of $matchedbraces and the value of $command + # back into storage + push(@commandstore,{commandname=>$commandname, + matchedbraces=>$matchedbraces, + lookforelse=>$lookforelse, + countzeros=>$countzeros}); + + # tracing mode + print $logfile "Line $lineCounter\t Searching for closing BRACE } $commandname\n" if($tracingMode); + } + } + } +} + +sub check_for_else{ + # PURPOSE: Check for an else clause + # + # Some commands have the form + # + # \mycommand{ + # if this + # } + # { + # else this + # } + # + # so we need to look for the else bit, and set + # the indentation appropriately. + # + # We only perform this check if there's something + # in the array @commandstore, and if + # the line itself is not a command, or comment, + # and if it begins with { + + if(scalar(@commandstore) + and !($_ =~ m/^\s*(\\)?(.*?)(\[|{|=)/ + and (scalar($checkunmatched{$2}) + or scalar($checkunmatchedELSE{$2}) + or $alwaysLookforSplitBraces)) + and $_ =~ m/^\s*{/ + and $_ !~ m/^\s*%/ + ) + { + # get the details of the most recent command name + $commanddetails = pop(@commandstore); + $commandname = $commanddetails->{'commandname'}; + $matchedbraces = $commanddetails->{'matchedbraces'}; + $countzeros = $commanddetails->{'countzeros'}; + $lookforelse= $commanddetails->{'lookforelse'}; + + # increase indentation + if($lookforelse and $countzeros==1) + { + &increase_indent($commandname); + } + + # put the array back together + push(@commandstore,{commandname=>$commandname, + matchedbraces=>$matchedbraces, + lookforelse=>$lookforelse, + countzeros=>$countzeros}); + } +} + +sub at_beg_of_env_or_eq{ + # PURPOSE: Check if we're at the BEGINning of an environment + # or at the BEGINning of a displayed equation \[ + # + # This subroutine checks for matches of the form + # + # \begin{environmentname} + # or + # \[ + # + # It also checks to see if the current environment + # should have alignment delimiters; if so, we need to turn + # ON the $delimiter switch + + # How to read + # m/^\s*(\$)?\\begin{(.*?)}/ + # + # ^ beginning of a line + # \s* any white spaces (possibly none) + # (\$)? possibly a $ symbol, but not required + # \\begin{(.*)?} \begin{environmentname} + # + # How to read + # m/^\s*()(\\\[)/ + # + # ^ beginning of a line + # \s* any white spaces (possibly none) + # () empty just so that $1 and $2 are defined + # (\\\[) \[ there are lots of \ because both \ and [ need escaping + + if( ( ( $_ =~ m/^\s*(\$)?\\begin{(.*?)}/ and $_ !~ m/\\end{$2}/) + or ($_=~ m/^\s*()(\\\[)/ and $_ !~ m/\\\]/) ) + and $_ !~ m/^\s*%/ ) + { + # tracing mode + print $logfile "Line $lineCounter\t \\begin{environment} found: $2 \n" if($tracingMode); + + # increase the indentation + &increase_indent($2); + + # check for verbatim-like environments + if($verbatimEnvironments{$2}) + { + $inverbatim = 1; + # tracing mode + print $logfile "Line $lineCounter\t \\begin{verbatim-like} found, $2, switching ON verbatim \n" if($tracingMode); + + # remove the key and value from %lookForAlignDelims hash + # to avoid any further confusion + if($lookForAlignDelims{$2}) + { + print $logfile "WARNING\n\t Line $lineCounter\t $2 is in *both* lookForAlignDelims and verbatimEnvironments\n"; + print $logfile "\t\t\t ignoring lookForAlignDelims and prioritizing verbatimEnvironments\n"; + print $logfile "\t\t\t Note that you only get this message once per environment\n"; + delete $lookForAlignDelims{$2}; + } + + } + + # check to see if we need to look for alignment + # delimiters + if($lookForAlignDelims{$2}) + { + $delimiters=1; + # tracing mode + print $logfile "Line $lineCounter\t Delimiter environment started: $2 (see lookForAlignDelims)\n" if($tracingMode); + } + + # store the name of the environment + push(@environmentStack,$2); + + } +} + +sub at_end_of_env_or_eq{ + # PURPOSE: Check if we're at the END of an environment + # or at the END of a displayed equation \] + # + # This subroutine checks for matches of the form + # + # \end{environmentname} + # or + # \] + # + # It also checks to see if the current environment + # had alignment delimiters; if so, we need to turn + # OFF the $delimiter switch + + if( ($_ =~ m/^\s*\\end{(.*?)}/ or $_=~ m/^(\\\])/) + and $_ !~ m/\s*^%/) + { + + # check if we're at the end of a verbatim-like environment + if($verbatimEnvironments{$1}) + { + $inverbatim = 0; + # tracing mode + + print $logfile "Line $lineCounter\t \\end{verbatim-like} found: $1, switching off verbatim \n" if($tracingMode); + print $logfile "Line $lineCounter\t removing leading spaces \n" if($tracingMode); + #s/^\ *//; + s/^\t+// if($_ ne ""); + s/^\s+// if($_ ne ""); + } + + # check to see if \end{environment} fits with most recent \begin{...} + my $previousEnvironment = pop(@environmentStack); + + # check to see if we need to turn off alignment + # delimiters and output the current block + if($lookForAlignDelims{$1} and ($previousEnvironment eq $1)) + { + $delimiters=0; + + # tracing mode + print $logfile "Line $lineCounter\t Delimiter body FINISHED: $1\n" if($tracingMode); + + # print the current FORMATTED block + @block = &format_block(@block); + foreach $line (@block) + { + # add the indentation and add the + # each line of the formatted block + # to the output + # unless this would only create trailing whitespace and the + # corresponding option is set + unless ($line =~ m/^$/ and $removeTrailingWhitespace) + { + $line = join("",@indent).$line; + } + push(@lines,$line); + } + # empty the @block, very important! + @block=(); + } + + # tracing mode + print $logfile "Line $lineCounter\t \\end{envrionment} found: $1 \n" if($tracingMode and !$verbatimEnvironments{$1}); + + # check to see if \end{environment} fits with most recent \begin{...} + if($previousEnvironment eq $1) + { + # decrease the indentation (if appropriate) + &decrease_indent($1); + } + else + { + # otherwise put the environment name back on the stack + push(@environmentStack,$previousEnvironment); + print $logfile "Line $lineCounter\t WARNING: \\end{$1} found on its own line, not matched to \\begin{$previousEnvironment}\n" unless ($delimiters or $inverbatim or $inIndentBlock or $1 eq "\\\]"); + } + + # need a special check for \[ and \] + if($1 eq "\\\]") + { + &decrease_indent($1); + pop(@environmentStack); + } + + # if we're at the end of the document, we remove all current + # indentation- this is especially prominent in examples that + # have headings, and the user has chosen to indentAfterHeadings + if($1 eq "document" and !(grep(/filecontents/, @indentNames)) and !$inpreamble and !$delimiters and !$inverbatim and !$inIndentBlock) + { + @indent=(); + @indentNames=(); + print $logfile "Line $lineCounter\t \\end{$1} found- emptying indent array \n" unless ($delimiters or $inverbatim or $inIndentBlock or $1 eq "\\\]"); + } + } +} + +sub format_block{ + # PURPOSE: Format a delimited environment such as the + # tabular or align environment that contains & + # + # INPUT: @block array containing unformatted block + # from, for example, align, or tabular + # OUTPUT: @formattedblock array containing FORMATTED block + + + # @block is the input + my @block=@_; + + # tracing mode + print $logfile "\t\tFormatting alignment block\n" if($tracingMode); + + # step the line counter back to the beginning of the block- + # it will be increased back to the end of the block in the + # loop later on: foreach $row (@tmpblock) + $lineCounter -= scalar(@block); + + + # local array variables + my @formattedblock; + my @tmprow=(); + my @tmpblock=(); + my @maxmstringsize=(); + my @ampersandCount=(); + + # local scalar variables + my $alignrowcounter=-1; + my $aligncolcounter=-1; + my $tmpstring; + my $row; + my $column; + my $maxmcolstrlength; + my $i; + my $j; + my $fmtstring; + my $linebreak; + my $maxNumberAmpersands = 0; + my $currentNumberAmpersands; + my $trailingcomments; + + # local hash table + my %stringsize=(); + + # loop through the block and count & per line- store the biggest + # NOTE: this needs to be done in its own block so that + # we can know what the maximum number of & in the block is + foreach $row (@block) + { + # delete trailing comments + $trailingcomments=''; + if($row =~ m/((?<!\\)%.*$)/) + { + $row =~ s/((?<!\\)%.*)/%TC/; + $trailingcomments=$1; + } + + # reset temporary counter + $currentNumberAmpersands=0; + + # count & in current row (exclude \&) + $currentNumberAmpersands++ while ($row =~ /(?<!\\)&/g); + + # store the ampersand count for future + push(@ampersandCount,$currentNumberAmpersands); + + # overwrite maximum count if the temp count is higher + $maxNumberAmpersands = $currentNumberAmpersands if($currentNumberAmpersands > $maxNumberAmpersands ); + + # put trailing comments back on + if($trailingcomments) + { + $row =~ s/%TC/$trailingcomments/; + } + } + + # tracing mode + print $logfile "\t\tmaximum number of & in any row: $maxNumberAmpersands\n" if($tracingMode); + + # loop through the lines in the @block + foreach $row (@block) + { + # get the ampersand count + $currentNumberAmpersands = shift(@ampersandCount); + + # increment row counter + $alignrowcounter++; + + # clear the $linebreak variable + $linebreak=''; + + # check for line break \\ + # and don't mess with a line that doesn't have the maximum + # number of & + if($row =~ m/\\\\/ and $currentNumberAmpersands==$maxNumberAmpersands ) + { + # remove \\ and all characters that follow + # and put it back in later, once the measurement + # has been done + $row =~ s/(\\\\.*)//; + $linebreak = $1; + } + + if($currentNumberAmpersands==$maxNumberAmpersands) + { + + # remove trailing comments + $trailingcomments=''; + if($row =~ m/((?<!\\)%.*$)/) + { + $row =~ s/((?<!\\)%.*)/%TC/; + $trailingcomments=$1; + } + + # separate the row at each &, but not at \& + @tmprow = split(/(?<!\\)&/,$row); + + # reset column counter + $aligncolcounter=-1; + + # loop through each column element + # removing leading and trailing space + foreach $column (@tmprow) + { + # increment column counter + $aligncolcounter++; + + # remove leading and trailing space from element + $column =~ s/^\s+//; + $column =~ s/\s+$//; + + # assign string size to the array + $stringsize{$alignrowcounter.$aligncolcounter}=length($column); + if(length($column)==0) + { + $column=" "; + } + + # put the row back together + if ($aligncolcounter ==0) + { + $tmpstring = $column; + } + else + { + $tmpstring .= "&".$column; + } + } + + + # put $linebreak back on the string, now that + # the measurement has been done + $tmpstring .= $linebreak; + + # put trailing comments back on + if($trailingcomments) + { + $tmpstring =~ s/%TC/$trailingcomments/; + } + + push(@tmpblock,$tmpstring); + } + else + { + # if there are no & then use the + # NOFORMATTING token + # remove leading space + s/^\s+//; + push(@tmpblock,$row."NOFORMATTING"); + } + } + + # calculate the maximum string size of each column + for($j=0;$j<=$aligncolcounter;$j++) + { + $maxmcolstrlength=0; + for($i=0; $i<=$alignrowcounter;$i++) + { + # make sure the stringsize is defined + if(defined $stringsize{$i.$j}) + { + if ($stringsize{$i.$j}>$maxmcolstrlength) + { + $maxmcolstrlength = $stringsize{$i.$j}; + } + } + } + push(@maxmstringsize,$maxmcolstrlength); + } + + # README: printf( formatting, expression) + # + # formatting has the form %-50s & %-20s & %-19s + # (the numbers have been made up for example) + # the - symbols mean that each column should be left-aligned + # the numbers represent how wide each column is + # the s represents string + # the & needs to be inserted + + # join up the maximum string lengths using "s %-" + $fmtstring = join("s & %-",@maxmstringsize); + + # add an s to the end, and a newline + $fmtstring .= "s "; + + # add %- to the beginning + $fmtstring = "%-".$fmtstring; + + # process the @tmpblock of aligned material + foreach $row (@tmpblock) + { + + $linebreak=''; + # check for line break \\ + if($row =~ m/\\\\/) + { + # remove \\ and all characters that follow + # and put it back in later + $row =~ s/(\\\\.*$)//; + $linebreak = $1; + } + + if($row =~ m/NOFORMATTING/) + { + $row =~ s/NOFORMATTING//; + $tmpstring=$row; + + # tracing mode + print $logfile "\t\tLine $lineCounter\t maximum number of & NOT found- not aligning delimiters \n" if($tracingMode); + } + else + { + # remove trailing comments + $trailingcomments=''; + if($row =~ m/((?<!\\)%.*$)/) + { + $row =~ s/((?<!\\)%.*)/%TC/; + $trailingcomments=$1; + } + + $tmpstring = sprintf($fmtstring,split(/(?<!\\)&/,$row)).$linebreak."\n"; + + # put trailing comments back on + if($trailingcomments) + { + $tmpstring =~ s/%TC/$trailingcomments/; + } + + # tracing mode + print $logfile "\t\tLine $lineCounter\t Found maximum number of & so aligning delimiters\n" if($tracingMode); + } + + # remove trailing whitespace + if ($removeTrailingWhitespace) + { + print $logfile "Line $lineCounter\t removing trailing whitespace from delimiter aligned line\n" if ($tracingMode); + $tmpstring =~ s/\s+$/\n/; + } + + push(@formattedblock,$tmpstring); + + # increase the line counter + $lineCounter++; + } + + # return the formatted block + @formattedblock; +} + +sub increase_indent{ + # PURPOSE: Adjust the indentation + # of the current environment; + # check that it's not an environment + # that doesn't want indentation. + + my $command = pop(@_); + + # if the user has specified $indentRules{$command} and + # $noAdditionalIndent{$command} then they are a bit confused- + # we remove the $indentRules{$command} and assume that they + # want $noAdditionalIndent{$command} + if(scalar($indentRules{$command}) and $noAdditionalIndent{$command}) + { + print $logfile "WARNING\n\t Line $lineCounter\t $command is in *both* indentRules and noAdditionalIndent\n"; + print $logfile "\t\t\t ignoring indentRules and prioritizing noAdditionalIndent\n"; + print $logfile "\t\t\t Note that you only get this message once per command/environment\n"; + + # remove the key and value from %indentRules hash + # to avoid any further confusion + delete $indentRules{$command}; + } + + # if the command is in verbatimEnvironments and in indentRules then + # remove it from %indentRules hash + # to avoid any further confusion + if($indentRules{$command} and $verbatimEnvironments{$command}) + { + # remove the key and value from %indentRules hash + # to avoid any further confusion + print $logfile "WARNING\n\t Line $lineCounter\t $command is in *both* indentRules and verbatimEnvironments\n"; + print $logfile "\t\t\t ignoring indentRules and prioritizing verbatimEnvironments\n"; + print $logfile "\t\t\t Note that you only get this message once per environment\n"; + delete $indentRules{$command}; + } + + if(scalar($indentRules{$command})) + { + # if there's a rule for indentation for this environment + push(@indent, $indentRules{$command}); + # tracing mode + print $logfile "Line $lineCounter\t increasing indent using rule for $command (see indentRules)\n" if($tracingMode); + push(@indentNames,"$command (rule)"); + } + else + { + # default indentation + if(!($noAdditionalIndent{$command} or $verbatimEnvironments{$command} or $inverbatim)) + { + push(@indent, $defaultIndent); + push(@indentNames,"$command (default)"); + # tracing mode + print $logfile "Line $lineCounter\t increasing indent using defaultIndent\n" if($tracingMode); + } + elsif($noAdditionalIndent{$command}) + { + # tracing mode + print $logfile "Line $lineCounter\t no additional indent added for $command (see noAdditionalIndent)\n" if($tracingMode); + } + } +} + +sub decrease_indent{ + # PURPOSE: Adjust the indentation + # of the current environment; + # check that it's not an environment + # that doesn't want indentation. + + my $command = pop(@_); + + if(!($noAdditionalIndent{$command} or $verbatimEnvironments{$command} or $inverbatim)) + { + pop(@indent); + pop(@indentNames); + # tracing mode + print $logfile "Line $lineCounter\t decreasing indent to: ",join(", ",@indentNames),"\n" if($tracingMode); + } +} + diff --git a/Master/bin/alpha-linux/latexindent b/Master/bin/alpha-linux/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/alpha-linux/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/amd64-freebsd/latexindent b/Master/bin/amd64-freebsd/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/amd64-freebsd/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/amd64-kfreebsd/latexindent b/Master/bin/amd64-kfreebsd/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/amd64-kfreebsd/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/amd64-netbsd/latexindent b/Master/bin/amd64-netbsd/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/amd64-netbsd/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/armel-linux/latexindent b/Master/bin/armel-linux/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/armel-linux/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/armhf-linux/latexindent b/Master/bin/armhf-linux/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/armhf-linux/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/i386-cygwin/latexindent b/Master/bin/i386-cygwin/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/i386-cygwin/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/i386-freebsd/latexindent b/Master/bin/i386-freebsd/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/i386-freebsd/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/i386-kfreebsd/latexindent b/Master/bin/i386-kfreebsd/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/i386-kfreebsd/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/i386-linux/latexindent b/Master/bin/i386-linux/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/i386-linux/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/i386-netbsd/latexindent b/Master/bin/i386-netbsd/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/i386-netbsd/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/i386-solaris/latexindent b/Master/bin/i386-solaris/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/i386-solaris/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/mips-irix/latexindent b/Master/bin/mips-irix/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/mips-irix/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/mipsel-linux/latexindent b/Master/bin/mipsel-linux/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/mipsel-linux/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/powerpc-linux/latexindent b/Master/bin/powerpc-linux/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/powerpc-linux/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/sparc-solaris/latexindent b/Master/bin/sparc-solaris/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/sparc-solaris/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/universal-darwin/latexindent b/Master/bin/universal-darwin/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/universal-darwin/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/win32/latexindent.exe b/Master/bin/win32/latexindent.exe Binary files differnew file mode 100755 index 00000000000..5777d90a17a --- /dev/null +++ b/Master/bin/win32/latexindent.exe diff --git a/Master/bin/x86_64-darwin/latexindent b/Master/bin/x86_64-darwin/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/x86_64-darwin/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/x86_64-linux/latexindent b/Master/bin/x86_64-linux/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/x86_64-linux/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/bin/x86_64-solaris/latexindent b/Master/bin/x86_64-solaris/latexindent new file mode 120000 index 00000000000..420acccd860 --- /dev/null +++ b/Master/bin/x86_64-solaris/latexindent @@ -0,0 +1 @@ +../../texmf-dist/scripts/latexindent/latexindent.pl
\ No newline at end of file diff --git a/Master/texmf-dist/doc/support/latexindent/README b/Master/texmf-dist/doc/support/latexindent/README new file mode 100644 index 00000000000..606460409a4 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/README @@ -0,0 +1,47 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + PERL script to indent code within environments, and align delimited + environments in .tex files. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + See http://www.gnu.org/licenses/ + + Dr. C. M. Hughes + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+ + +FOR COMPLETE DETAILS, PLEASE SEE documentation/manual.pdf + +*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+ + +USAGE + You'll need + + latexindent.pl + defaultSettings.yaml + + in the same directory. Windows users might prefer to grab latexindent.exe + +* IMPORTANT * + +This script may not work for your style of formatting; I highly +recommend comparing the outputfile.tex to make sure that +nothing has been changed (or removed) in a way that will damage +your file. + +I recommend both using the following: + - a visual check, at the very least, make sure that + each file has the same number of lines + - a check using latexdiff inputfile.tex outputfile.tex + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Master/texmf-dist/doc/support/latexindent/documentation/manual.pdf b/Master/texmf-dist/doc/support/latexindent/documentation/manual.pdf Binary files differnew file mode 100644 index 00000000000..16a709c50e9 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/documentation/manual.pdf diff --git a/Master/texmf-dist/doc/support/latexindent/documentation/manual.tex b/Master/texmf-dist/doc/support/latexindent/documentation/manual.tex new file mode 100644 index 00000000000..6f6c76f25e8 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/documentation/manual.tex @@ -0,0 +1,1042 @@ +% arara: pdflatex +% !arara: bibtex +% !arara: pdflatex +% !arara: pdflatex +% !arara: indent: {overwrite: yes, trace: yes, localSettings: no, silent: yes} +\begin{filecontents}{mybib.bib} + @online{cmh:videodemo, + title="Video demonstration of latexindet.pl on youtube", + url="http://www.youtube.com/watch?v=s_AMmNVg5WM"} + @online{cpan, + title="CPAN: Comprehensive Perl Archive Network", + url="http://www.cpan.org/"} + @online{strawberryperl, + title="Strawberry Perl", + url="http://strawberryperl.com/"} + @online{cmhblog, + title="A Perl script for indenting tex files", + url="http://tex.blogoverflow.com/2012/08/a-perl-script-for-indenting-tex-files/"} +\end{filecontents} +\documentclass[11pt]{article} +% This program is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% See <http://www.gnu.org/licenses/>. +\usepackage[left=4.5cm,right=2.5cm,showframe=false, +top=2cm,bottom=1.5cm]{geometry} % page setup +\usepackage{parskip} % paragraph skips +\usepackage{booktabs} % beautiful tables +\usepackage{listings} % nice verbatim environments +\usepackage{titlesec} % customize headings +\usepackage{changepage} % adjust width of page +\usepackage{fancyhdr} % headers & footers +\usepackage[sc,format=hang,font=small]{caption} % captions +\usepackage[backend=bibtex]{biblatex} % bibliography +\usepackage{mdframed} % framed environments +\usepackage[charter]{mathdesign} % changes font +\usepackage[expansion=false,kerning=true]{microtype} % better kerning +\usepackage{enumitem} % custom lists +\usepackage{tikz} % so so much +\usetikzlibrary{positioning} +\usepackage{varioref} % clever referencing +\usepackage[colorlinks=true,linkcolor=blue,citecolor=black]{hyperref} +\usepackage{cleveref} + +\addbibresource{mybib} + +\newmdenv[linecolor=red,innertopmargin=.5cm,linewidth=3pt, + splittopskip=\topskip,skipbelow=0pt,% +]{warning} + +\lstset{% + basicstyle=\small\ttfamily,language={[LaTeX]TeX}, + numbers=left, + numberstyle=\ttfamily\small, + breaklines=true,frame=single,framexleftmargin=8mm, xleftmargin=8mm, + prebreak = \raisebox{0ex}[0ex][0ex]{\ensuremath{\hookrightarrow}}, + backgroundcolor=\color{green!5},frameround=fttt, + rulecolor=\color{blue!70!black}, + keywordstyle=\color{blue}, % keywords + commentstyle=\color{purple}, % comments + tabsize=3, + %columns=fullflexible +}% +\lstdefinestyle{demo}{numbers=none,xleftmargin=0mm,framexleftmargin=0mm,linewidth=1.25\textwidth} +\newcommand{\verbitem}[1]{\small\ttfamily{#1}} +% stolen from arara.sty http://mirrors.med.harvard.edu/ctan/support/arara/doc/arara.sty +\lstnewenvironment{yaml}[1][]{\lstset{% + basicstyle=\ttfamily, + numbers=left, + xleftmargin=1.5em, + breaklines=true, + numberstyle=\ttfamily\small, + columns=flexible, + mathescape=false, + #1, +}} +{} + +\newcommand{\fixthis}[1] +{% + \marginpar{\huge \color{red} \framebox{FIX}}% + \typeout{FIXTHIS: p\thepage : #1^^J}% +} +% custom section +\titleformat{\section} +{\normalfont\Large\bfseries} +{\llap{\thesection\hskip.5cm}} +{0pt} +{} +% custom subsection +\titleformat{\subsection} +{\normalfont\bfseries} +{\llap{\thesubsection\hskip.5cm}} +{0pt} +{} +% custom subsubsection +\titleformat{\subsubsection} +{\normalfont\bfseries} +{\llap{\thesubsubsection\hskip.5cm}} +{0pt} +{} + + +\titlespacing\section{0pt}{12pt plus 4pt minus 2pt}{-5pt plus 2pt minus 2pt} +\titlespacing\subsection{0pt}{12pt plus 4pt minus 2pt}{-6pt plus 2pt minus 2pt} +\titlespacing\subsubsection{0pt}{12pt plus 4pt minus 2pt}{-6pt plus 2pt minus 2pt} + + +% cleveref settings +\crefname{table}{Table}{Tables} +\Crefname{table}{Table}{Tables} +\crefname{figure}{Figure}{Figures} +\Crefname{figure}{Figure}{Figures} +\crefname{section}{Section}{Sections} +\Crefname{section}{Section}{Sections} +\crefname{lstlisting}{Listing}{Listings} +\Crefname{lstlisting}{Listing}{Listings} + +\begin{document} + +% \begin{noindent} + \title{\lstinline[basicstyle=\huge\ttfamily]!latexindent.pl!\\[1cm] + Version 1.1R} +% \end{noindent} +\author{Chris Hughes \footnote{smr01cmh AT users.sourceforge.net}} +\maketitle +\begin{abstract} + \lstinline!latexindent.pl! is a \lstinline!Perl! script that indents \lstinline!.tex! + files according to an indentation scheme that the user can modify to suit their + taste. Environments, including those with alignment delimiters (such as \lstinline!tabular!), + and commands, including those that can split braces and brackets across lines, + are \emph{usually} handled correctly by the script. Options for \lstinline!verbatim!-like + environments and indentation after headings (such as \lstinline!\chapter!, \lstinline!\section!, etc) + are also available. +\end{abstract} + +\tableofcontents +\lstlistoflistings + +\section{Before we begin} +\subsection{Thanks} +I first created \lstinline!latexindent.pl! to help me format chapter files +in a big project. After I blogged about it on the +\TeX{} stack exchange \cite{cmhblog} I received some positive feedback and +follow-up feature requests. A big thank you to Harish Kumar who has really +helped to drive the script forward and has put it through a number of challenging +tests-- I look forward to more challenges in the future Harish! + +The \lstinline!yaml!-based interface of \lstinline!latexindent.pl! was inspired +by the wonderful \lstinline!arara! tool; any similarities are deliberate, and +I hope that it is perceived as the compliment that it is. Thank you to Paulo Cereda and the +team for releasing this awesome tool; I initially worried that I was going to +have to make a GUI for \lstinline!latexindent.pl!, but the release of \lstinline!arara! +has meant there is no need. Thank you to Paulo for all of your advice and +encouragement. + +\subsection{License} +\lstinline!latexindent.pl! is free and open source, and it always will be. +Before you start using it on any important files, bear in mind that \lstinline!latexindent.pl! has the option to overwrite your \lstinline!.tex! files. +It will always make at least one backup (you can choose how many it makes, see \cpageref{page:onlyonebackup}) +but you should still be careful when using it. The script has been tested on many +files, but there are some known limitations (see \cref{sec:knownlimitations}). +You, the user, are responsible for ensuring that you maintain backups of your files +before running \lstinline!latexindent.pl! on them. I think it is important at this +stage to restate an important part of the license here: +\begin{quote}\itshape + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. +\end{quote} +There is certainly no malicious intent in releasing this script, and I do hope +that it works as you expect it to-- if it does not, please first of all +make sure that you have the correct settings, and then feel free to let me know with a +complete minimum working example as I would like to improve the code as much as possible. + +\begin{warning} + Before you try the script on anything important (like your thesis), test it + out on the sample files that come with it in the \lstinline!success! directory. +\end{warning} + + +\section{Demonstration: before and after} +Let's give a demonstration of some before and after code-- after all, you probably +won't want to try the script if you don't much like the results. You might also +like to watch the video demonstration I made on youtube \cite{cmh:videodemo} + +As you look at \crefrange{lst:filecontentsbefore}{lst:pstricksafter}, remember +that \lstinline!latexindent.pl! is just following its rules-- there is nothing +particular about these code snippets. All of the rules can be modified +so that each user can personalize their indentation scheme. + +In each of the samples given in \crefrange{lst:filecontentsbefore}{lst:pstricksafter} +the `before' case is a `worst case scenario' with no effort to make indentation. The `after' +result would be the same, regardless of the leading white space at the beginning of +each line which is stripped by \lstinline!latexindent.pl! (unless a \lstinline!verbatim!-like +environment or \lstinline!noIndentBlock! is specified-- more on this in \cref{sec:defuseloc}). + +\begin{adjustwidth}{-2cm}{2cm} + \begin{minipage}{.5\textwidth} + \begin{lstlisting}[style=demo,caption={\lstinline!filecontents! before},label={lst:filecontentsbefore}] +\begin{filecontents}{mybib.bib} +@online{strawberryperl, +title="Strawberry Perl", +url="http://strawberryperl.com/"} +@online{cmhblog, +title="A Perl script ... +url="... +\end{filecontents} + \end{lstlisting} + \end{minipage}% + \begin{minipage}{.5\textwidth} + \begin{lstlisting}[style=demo,caption={\lstinline!filecontents! after}] +\begin{filecontents}{mybib.bib} + @online{strawberryperl, + title="Strawberry Perl", + url="http://strawberryperl.com/"} + @online{cmhblog, + title="A Perl script for ... + url="... +\end{filecontents} + \end{lstlisting} + \end{minipage} + + \begin{minipage}{.5\textwidth} + \begin{lstlisting}[style=demo,caption={\lstinline!tikzset! before}] +\tikzset{ +shrink inner sep/.code={ +\pgfkeysgetvalue... +\pgfkeysgetvalue... +} +} + \end{lstlisting} + \end{minipage}% + \begin{minipage}{.5\textwidth} + \begin{lstlisting}[style=demo,caption={\lstinline!tikzset! after}] +\tikzset{ + shrink inner sep/.code={ + \pgfkeysgetvalue... + \pgfkeysgetvalue... + } +} + \end{lstlisting} + \end{minipage} + \begin{minipage}{.5\textwidth} + \begin{lstlisting}[style=demo,caption={\lstinline!pstricks! before}] +\def\Picture#1{% +\def\stripH{#1}% +\begin{pspicture}[showgrid... +\psforeach{\row}{% +{{3,2.8,2.7,3,3.1}},% <=== Only this +{2.8,1,1.2,2,3},% +... +}{% +\expandafter... +} +\end{pspicture}} + \end{lstlisting} + \end{minipage}% + \begin{minipage}{.5\textwidth} + \begin{lstlisting}[style=demo,caption={\lstinline!pstricks! after},label={lst:pstricksafter}] +\def\Picture#1{% + \def\stripH{#1}% + \begin{pspicture}[showgrid... + \psforeach{\row}{% + {{3,2.8,2.7,3,3.1}},% <=== + {2.8,1,1.2,2,3},% + ... + }{% + \expandafter... + } + \end{pspicture}} + \end{lstlisting} + \end{minipage} +\end{adjustwidth} + +\section{How to use the script} +There are two ways to use \lstinline!latexindent.pl!: from the command line, +and using \lstinline!arara!. We will discuss how to change the settings and behaviour +of the script in \cref{sec:defuseloc}. + +\lstinline!latexindent.pl! ships with \lstinline!latexindent.exe! for Windows +users, so that you can use the script with or without a Perl distribution. +If you plan to use \lstinline!latexindent.pl! (i.e, the original Perl script) then you will +need a few standard Perl modules-- see \vref{sec:requiredmodules} for details. + +In what follows, we will always refer to \lstinline!latexindent.pl!, but depending on +your operating system and preference, you might substitute \lstinline!latexindent.exe! or +simply \lstinline!latexindent!. + +\subsection{From the command line}\label{sec:commandline} +\lstinline!latexindent.pl! has a number of different switches/flags/options, which +can be combined in any way that you like. \lstinline!latexindent.pl! +produces a \lstinline!.log! file, \lstinline!indent.log! every time it +is run. There is a base of information that is written to \lstinline!indent.log!, +but other additional information will be written depending +on which of the following options are used. + +\begin{itemize}[labelsep=.5cm] + \item[] \lstinline!latexindent.pl! + + This will output a welcome message to the terminal, including the version number + and available options. + \item[\verbitem{-h}] \lstinline!latexindent.pl -h! + + As above this will output a welcome message to the terminal, including the version number + and available options. + \item[] \lstinline!latexindent.pl myfile.tex! + + This will operate on \lstinline!myfile.tex!, but will simply output to your terminal; \lstinline!myfile.tex! will not be changed in any way using this command. + \item[\verbitem{-w}] \lstinline!latexindent.pl -w myfile.tex! + + This \emph{will} overwrite \lstinline!myfile.tex!, but it will + make a copy of \lstinline!myfile.tex! first. You can control the name of + the extension (default is \lstinline!.bak!), and how many different backups are made-- + more on this in \cref{sec:defuseloc}; see \lstinline!backupExtension! and \lstinline!onlyOneBackUp!. + + Note that if \lstinline!latexindent.pl! can not create the backup, then it + will exit without touching your original file; an error message will be given + asking you to check the permissions of the backup file. + \item[\verbitem{-o}] \lstinline!latexindent.pl -o myfile.tex outputfile.tex! + + This will indent \lstinline!myfile.tex! and output it to \lstinline!outputfile.tex!, + overwriting it (\lstinline!outputfile.tex!) if it already exists. Note that if \lstinline!latexindent.pl! is called with both + the \lstinline!-w! and \lstinline!-o! switches, then \lstinline!-w! will + be ignored and \lstinline!-o! will take priority (this seems safer than the + other way round). + + Note that using \lstinline!-o! is equivalent to using \lstinline!latexindent.pl myfile.tex > outputfile.tex! + \item[\verbitem{-s}] \lstinline!latexindent.pl -s myfile.tex! + + Silent mode: no output will be given to the terminal. + \item[\verbitem{-t}] \lstinline!latexindent.pl -t myfile.tex! + + Tracing mode: verbose output will be given to \lstinline!indent.log!. This + is useful if \lstinline!latexindent.pl! has made a mistake and you're + trying to find out where and why. You might also be interested in learning + about \lstinline!latexindent.pl!'s thought process-- if so, this + switch is for you. + \item[\verbitem{-l}] \lstinline!latexindent.pl -l myfile.tex! + + \label{page:localswitch} + Local settings: you might like to read \cref{sec:defuseloc} before + using this switch. \lstinline!latexindent.pl! will always load \lstinline!defaultSettings.yaml! + and if it is called with the \lstinline!-l! switch and it finds \lstinline!localSettings.yaml! + in the same directory as \lstinline!myfile.tex! then these settings will be + added to the indentation scheme. Information will be given in \lstinline!indent.log! on + the success or failure of loading \lstinline!localSettings.yaml!. + \item[\verbitem{-d}] \lstinline!latexindent.pl -d myfile.tex! + + Only \lstinline!defaultSettings.yaml!: you might like to read \cref{sec:defuseloc} before + using this switch. By default, \lstinline!latexindent.pl! will always search for + \lstinline!indentconfig.yaml! in your home directory. If you would prefer it not to do so + then (instead of deleting or renaming \lstinline!indentconfig.yaml!) you can simply + call the script with the \lstinline!-d! switch; note that this will also tell + the script to ignore \lstinline!localSettings.yaml! even if it has been called with the + \lstinline!-l! switch. + + \item[\verbitem{-c}]\lstinline!latexindent.pl -c=/path/to/directory/ myfile.tex! + + If you wish to have backup files and \lstinline!indent.log! written to a directory + other than the current working directory, then you can send these `cruft' files + to another directory. + % this switch was made as a result of http://tex.stackexchange.com/questions/142652/output-latexindent-auxiliary-files-to-a-different-directory +\end{itemize} + +\subsection{From \lstinline!arara!} +Using \lstinline!latexindent.pl! from the command line is fine for some folks, but +others may find it easier to use from \lstinline!arara!. \lstinline!latexindent.pl! +ships with an \lstinline!arara! rule, \lstinline!indent.yaml!, which can be copied +to the directory of +your other \lstinline!arara! rules; otherwise you can add the directory in which \lstinline!latexindent.pl! +resides to your \lstinline!araraconfig.yaml! file. + +Once you have told \lstinline!arara! where to find your \lstinline!indent! rule, +you can use it any of the ways described in \cref{lst:arara} (or combinations thereof). +In fact, \lstinline!arara! allows yet greater flexibility-- you can use \lstinline!yes/no!, \lstinline!true/false!, or \lstinline!on/off! to toggle the various options. + +\begin{lstlisting}[caption={\lstinline!arara! sample usage},label={lst:arara},escapeinside={(*@}{@*)}] +%(*@@*) arara: indent +%(*@@*) arara: indent: {overwrite: yes} +%(*@@*) arara: indent: {output: myfile.tex} +%(*@@*) arara: indent: {silent: yes} +%(*@@*) arara: indent: {trace: yes} +%(*@@*) arara: indent: {localSettings: yes} +%(*@@*) arara: indent: {onlyDefault: on} +%(*@@*) arara: indent: { cruft: /home/cmhughes/Desktop } +\documentclass{article} +... +\end{lstlisting} + +Hopefully the use of these rules is fairly self-explanatory, but for completeness +\cref{tab:orbsandswitches} shows the relationship between \lstinline!arara! directive arguments and the +switches given in \cref{sec:commandline}. + +\begin{table}[!ht] + \centering + \caption{\lstinline!arara! directive arguments and corresponding switches} + \label{tab:orbsandswitches} + \begin{tabular}{lc} + \toprule + \lstinline!arara! directive argument & switch \\ + \midrule + \lstinline!overwrite! & \lstinline!-w! \\ + \lstinline!output! & \lstinline!-o! \\ + \lstinline!silent! & \lstinline!-s! \\ + \lstinline!trace! & \lstinline!-t! \\ + \lstinline!localSettings! & \lstinline!-l! \\ + \lstinline!onlyDefault! & \lstinline!-d! \\ + \lstinline!cruft! & \lstinline!-c! \\ + \bottomrule + \end{tabular} +\end{table} + +The \lstinline!cruft! directive does not work well when used with +directories that contain spaces. + +\section{default, user, and local settings}\label{sec:defuseloc} +\lstinline!latexindent.pl! loads its settings from \lstinline!defaultSettings.yaml! +(rhymes with camel). The idea is to separate the behaviour of the script +from the internal working-- this is very similar to the way that we separate content +from form when writing our documents in \LaTeX. + +\subsection{\lstinline!defaultSettings.yaml!} +If you look in \lstinline!defaultSettings.yaml! you'll find the switches +that govern the behaviour of \lstinline!latexindent.pl!. If you're not sure where +\lstinline!defaultSettings.yaml! resides on your computer, don't worry as \lstinline!indent.log! +will tell you where to find it. +\lstinline!defaultSettings.yaml! is commented, +but here is a description of what each switch is designed to do. The default +value is given in each case. + +You can certainly feel free to edit \lstinline!defaultSettings.yaml!, but +this is not ideal as it may be overwritten when you update your distribution-- +all of your hard work tweaking the script would be undone! Don't worry, +there's a solution-- feel free to peek ahead to \cref{sec:indentconfig} if you like. +\begin{itemize} + \item[\verbitem{defaultIndent}] \lstinline!"\t"! + + This is the default indentation (\lstinline!\t! means a tab) used in the absence of other details + for the command or environment we are working with-- see \lstinline!indentRules! + for more details (\cpageref{page:indentRules}). + + If you're interested in experimenting with \lstinline!latexindent.pl! then you + can \emph{remove} all indentation by setting \lstinline!defaultIndent: ""! + \item[\verbitem{backupExtension}] \lstinline!.bak! + + If you call \lstinline!latexindent.pl! with the \lstinline!-w! switch (to overwrite + \lstinline!myfile.tex!) then it will create a backup file before doing + any indentation: \lstinline!myfile.bak0! + + By default, every time you call \lstinline!latexindent.pl! after this with + the \lstinline!-w! switch it will create \lstinline!myfile.bak1!, \lstinline!myfile.bak2!, + etc. + \item[\verbitem{onlyOneBackUp}] \lstinline!0! + + \label{page:onlyonebackup} + If you don't want a backup for every time that you call \lstinline!latexindent.pl! (so + you don't want \lstinline!myfile.bak1!, \lstinline!myfile.bak2!, etc) and you simply + want \lstinline!myfile.bak! (or whatever you chose \lstinline!backupExtension! to be) + then change \lstinline!onlyOneBackUp! to \lstinline!1!. + + \item[\verbitem{maxNumberOfBackUps}]\lstinline!0! + + Some users may only want a finite number of backup files, + say at most $3$, in which case, they can change this switch. + The smallest value of \lstinline!maxNumberOfBackUps! is $0$ which will \emph{not} + prevent back up files being made-- in this case, the behaviour will be dictated + entirely by \lstinline!onlyOneBackUp!. + %\footnote{This was a feature request made on \href{https://github.com/cmhughes/latexindent.plx}{github}} + + \item[\verbitem{indentPreamble}] \lstinline!0! + + The preamble of a document can sometimes contain some trickier code + for \lstinline!latexindent.pl! to work with. By default, \lstinline!latexindent.pl! + won't try to operate on the preamble, but if you'd like it to try then + change \lstinline!indentPreamble! to \lstinline!1!. + \item[\verbitem{alwaysLookforSplitBraces}] \lstinline!1! + + This switch tells \lstinline!latexindent.pl! to look for commands that + can split \emph{braces} across lines, such as \lstinline!parbox!, \lstinline!tikzset!, etc. In older + versions of \lstinline!latexindent.pl! you had to specify each one in \lstinline!checkunmatched!-- this + clearly became tedious, hence the introduction of \lstinline!alwaysLookforSplitBraces!. + + \emph{As long as you leave this switch on (set to 1) you don't need to specify which + commands can split braces across lines-- you can ignore the + fields \lstinline!checkunmatched! and \lstinline!checkunmatchedELSE! described later}. + \item[\verbitem{alwaysLookforSplitBrackets}] \lstinline!1! + + This switch tells \lstinline!latexindent.pl! to look for commands that + can split \emph{brackets} across lines, such as \lstinline!psSolid!, \lstinline!pgfplotstabletypeset!, + etc. In older versions of \lstinline!latexindent.pl! you had to specify each one in \lstinline!checkunmatchedbracket!-- + this clearly became tedious, hence the introduction of \lstinline!alwaysLookforSplitBraces!. + + \emph{As long as you leave this switch on (set to 1) you don't need to specify which + commands can split brackets across lines-- you can ignore \lstinline!checkunmatchedbracket! described later}. + + \item[\verbitem{removeTrailingWhitespace}] \lstinline!0! + + By default \lstinline!latexindent.pl! indents every line (including empty lines) + which creates `trailing whitespace' feared by most version control systems. If + this option is set to \lstinline!1!, trailing whitespace is removed from all + lines, also non-empty ones. In general this should not create any problems, but + by precaution this option is turned off by default. \footnote{Thanks to \href{https://github.com/vosskuhle}{vosskuhle} for + providing this feature.} + + \item[\verbitem{lookForAlignDelims}] This is the first example of a field + in \lstinline!defaultSettings.yaml! that has more than one line; \cref{lst:aligndelims} + shows more details. + + \begin{yaml}[caption={\lstinline!lookForAlignDelims!},label={lst:aligndelims}] +lookForAlignDelims: + tabular: 1 + array: 1 + matrix: 1 + bmatrix: 1 + pmatrix: 1 + align: 1 + align*: 1 + alignat: 1 + alignat*: 1 + aligned: 1 + cases: 1 + dcases: 1 + pmatrix: 1 + listabla: 1 + \end{yaml} + + The environments specified in this field will be operated on in a special way by \lstinline!latexindent.pl!. In particular, it will try and align each column by its alignment + tabs. It does have some limitations (discussed further in \cref{sec:knownlimitations}), + but in many cases it will produce results such as those in \cref{lst:tabularbefore,lst:tabularafter}. + + \begin{minipage}{.5\textwidth} + \begin{lstlisting}[caption={\lstinline!tabular! before},label={lst:tabularbefore}] +\begin{tabular}{cccc} +1& 2 &3 &4\\ +5& &6 &\\ +\end{tabular} + \end{lstlisting} + \end{minipage} + \begin{minipage}{.5\textwidth} + \begin{lstlisting}[caption={\lstinline!tabular! after},label={lst:tabularafter}] +\begin{tabular}{cccc} + 1 & 2 & 3 & 4 \\ + 5 & & 6 & \\ +\end{tabular} + \end{lstlisting} + \end{minipage} + + If you find that \lstinline!latexindent.pl! does not perform satisfactorily on such + environments then you can either remove them from \lstinline!lookForAlignDelims! altogether, or set the relevant key to \lstinline!0!, for example \lstinline!tabular: 0!, or if you just want to ignore \emph{specific} + instances of the environment, you could wrap them in something from \lstinline!noIndentBlock! (see \cref{lst:noIndentBlock}). + + \item[\verbitem{verbatimEnvironments}] A field that contains a list of environments + that you would like left completely alone-- no indentation will be done + to environments that you have specified in this field-- see \cref{lst:verbatimEnvironments}. + + \begin{yaml}[caption={\lstinline!verbatimEnvironments!},label={lst:verbatimEnvironments}] +verbatimEnvironments: + verbatim: 1 + lstlisting: 1 + \end{yaml} + Note that if you put an environment in \lstinline!verbatimEnvironments! + and in other fields such as \lstinline!lookForAlignDelims! or \lstinline!noAdditionalIndent! + then \lstinline!latexindent.pl! will \emph{always} prioritize \lstinline!verbatimEnvironments!. + + \item[\verbitem{noIndentBlock}] If you have a block of code that you don't + want \lstinline!latexindent.pl! to touch (even if it is \emph{not} a verbatim-like + environment) then you can wrap it in an environment from \lstinline!noIndentBlock!; + you can use any name you like for this, provided you populate it as demonstrate in + \cref{lst:noIndentBlock}. + + \begin{yaml}[caption={\lstinline!noIndentBlock!},label={lst:noIndentBlock}] +noIndentBlock: + noindent: 1 + cmhtest: 1 + \end{yaml} + + Of course, you don't want to have to specify these as null environments + in your code, so you use them with a comment symbol, \lstinline!%!, followed + by as many spaces (possibly none) as you like; see \cref{lst:noIndentBlockdemo} for + example. + \begin{lstlisting}[caption={\lstinline!noIndentBlock! demonstration},label={lst:noIndentBlockdemo},escapeinside={(*@}{@*)}] +%(*@@*) \begin{noindent} + this code + won't + be touched + by + latexindent.pl! +%(*@@*)\end{noindent} + \end{lstlisting} + + \item[\verbitem{noAdditionalIndent}] If you would prefer some of your + environments or commands not to receive any additional indent, then + populate \lstinline!noAdditionalIndent!; see \cref{lst:noAdditionalIndent}. + Note that these environments will still receive the \emph{current} level + of indentation unless they belong to \lstinline!verbatimEnvironments!, or \lstinline!noIndentBlock!. + + \begin{yaml}[caption={\lstinline!noAdditionalIndent!},label={lst:noAdditionalIndent}] +noAdditionalIndent: + document: 1 + myexample: 1 + mydefinition: 1 + problem: 1 + exercises: 1 + mysolution: 1 + foreach: 0 + widepage: 1 + comment: 1 + \[: 1 + \]: 1 + frame: 0 + \end{yaml} + Note in particular from \cref{lst:noAdditionalIndent} that if you wish content within + \lstinline!\[! and \lstinline!\]! to receive no additional content then + you have to specify \emph{both} as \lstinline!1! (the default is \lstinline!0!). + If you do not specify both as the same value you may get some interesting results! + \item[\verbitem{indentRules}] If\label{page:indentRules} you would prefer to specify + individual rules for certain environments or commands, just + populate \lstinline!indentRules!; see \cref{lst:indentRules} + + \begin{yaml}[caption={\lstinline!indentRules!},label={lst:indentRules}] +indentRules: + myenvironment: "\t\t" + anotherenvironment: "\t\t\t\t" + \[: "\t" + \end{yaml} %%%%%\] just here to stop vim from colouring the rest of my code + Note that in contrast to \lstinline!noAdditionalIndent! you do \emph{not} + need to specify both \lstinline!\[! and \lstinline!\]! in this field. + + If you put an environment in both \lstinline!noAdditionalIndent! and in + \lstinline!indentRules! then \lstinline!latexindent.pl! will resolve the conflict + by ignoring \lstinline!indentRules! and prioritizing \lstinline!noAdditionalIndent!. + You will get a warning message in \lstinline!indent.log!; note that you will only + get one warning message per command or environment. Further discussion + is given in \cref{sec:fieldhierachy}. + + \item[\verbitem{indentAfterHeadings}] This field enables the user to specify + indentation rules that take effect after heading commands such as \lstinline!\part!, \lstinline!\chapter!, + \lstinline!\section!, \lstinline!\subsection*! etc. This field is slightly different from all + of the fields that we have considered previously, because each element is + itself a field which has two elements: \lstinline!indent! and \lstinline!level!. + \begin{yaml}[caption={\lstinline!indentAfterHeadings!},label={lst:indentAfterHeadings}] +indentAfterHeadings: + part: + indent: 0 + level: 1 + chapter: + indent: 0 + level: 2 + section: + indent: 0 + level: 3 + ... + \end{yaml} + The default settings do \emph{not} place indentation after a heading-- you + can easily switch them on by changing \lstinline!indent: 0! to \lstinline!indent: 1!. + The \lstinline!level! field tells \lstinline!latexindent.pl! the hierarchy of the heading + structure in your document. You might, for example, like to have both \lstinline!section! + and \lstinline!subsection! set with \lstinline!level: 3! because you do not want the indentation to go too deep. + + You can add any of your own custom heading commands to this field, specifying the \lstinline!level! + as appropriate. You can also specify your own indentation in \lstinline!indentRules!-- + you will find the default \lstinline!indentRules! contains \lstinline!chapter: " "! which + tells \lstinline!latexindent.pl! simply to use a space character after \lstinline!\chapter! headings + (once \lstinline!indent! is set to \lstinline!1! for \lstinline!chapter!). + \begin{warning} + \emph{The following fields are marked in red, as they are not necessary + unless you wish to micro-manage your indentation scheme. + Note that in each case, you should \emph{not} use the backslash.} + \end{warning} + + % to anyone reading the source code- I know the next line isn't the + % correct way to do it :) + \item[\color{red}\verbitem{checkunmatched}] Assuming you keep \lstinline!alwaysLookforSplitBraces! set to \lstinline!1! (which + is the default) then you don't need to worry about \lstinline!checkunmatched!. + + Should you wish to deactivate \lstinline!alwaysLookforSplitBraces! by setting it to \lstinline!0!, then + you can populate \lstinline!checkunmatched! with commands that can split braces across + lines-- see \cref{lst:checkunmatched}. + + \begin{yaml}[caption={\lstinline!checkunmatched!},label={lst:checkunmatched}] +checkunmatched: + parbox: 1 + vbox: 1 + \end{yaml} + \item[\color{red}\verbitem{checkunmatchedELSE}] Similarly, assuming you keep \lstinline!alwaysLookforSplitBraces! set to \lstinline!1! (which + is the default) then you don't need to worry about \lstinline!checkunmatchedELSE!. + + As in \lstinline!checkunmatched!, should you wish to deactivate \lstinline!alwaysLookforSplitBraces! by setting it to \lstinline!0!, then + you can populate \lstinline!checkunmatchedELSE! with commands that can split braces across + lines \emph{and} have an `else' statement-- see \cref{lst:checkunmatchedELSE}. + + \begin{yaml}[caption={\lstinline!checkunmatchedELSE!},label={lst:checkunmatchedELSE}] +checkunmatchedELSE: + pgfkeysifdefined: 1 + DTLforeach: 1 + ifthenelse: 1 + \end{yaml} + \item[\color{red}\verbitem{checkunmatchedbracket}] Assuming you keep \lstinline!alwaysLookforSplitBrackets! + set to \lstinline!1! (which is the default) then you don't need to worry about \lstinline!checkunmatchedbracket!. + + Should you wish to deactivate \lstinline!alwaysLookforSplitBrackets! by setting it + to \lstinline!0!, then you can populate \lstinline!checkunmatchedbracket! with commands that can + split \emph{brackets} across lines-- see \cref{lst:checkunmatchedbracket}. + + \begin{yaml}[caption={\lstinline!checkunmatchedbracket!},label={lst:checkunmatchedbracket}] +checkunmatchedbracket: + psSolid: 1 + pgfplotstablecreatecol: 1 + pgfplotstablesave: 1 + pgfplotstabletypeset: 1 + mycommand: 1 + \end{yaml} +\end{itemize} + +\subsubsection{Hierarchy of fields}\label{sec:fieldhierachy} +After reading the previous section, it should sound reasonable that +\lstinline!noAdditionalIndent!, \lstinline!indentRules!, and +\lstinline!verbatim! all serve mutually exclusive tasks. Naturally, you may +well wonder what happens if you choose to ask \lstinline!latexindent.pl! to +prioritize one above the other. + +For example, let's say that you put the fields in \cref{lst:conflict} into +one of your settings files. +\begin{yaml}[caption={Conflicting ideas},label={lst:conflict}] +indentRules: + myenvironment: "\t\t" +noAdditionalIndent: + myenvironment: 1 +\end{yaml} + +Clearly these fields conflict: first of all +you are telling \lstinline!latexindent.pl! that \lstinline!myenvironment! should +receive two tabs of indentation, and then you are telling it +not to put any indentation in the environment. \lstinline!latexindent.pl! +will always make the decision to prioritize \lstinline!noAdditionalIndent! above +\lstinline!indentRules! regardless of the order that you load them in +your settings file. The first +time it encounters \lstinline!myenvironment! it will put a warning in \lstinline!indent.log! +and delete the offending key from \lstinline!indentRules! so that any future +conflicts won't have to be addressed. + +Let's consider another conflicting example in \cref{lst:bigconflict} +\begin{yaml}[caption={More conflicting ideas},label={lst:bigconflict}] +lookForAlignDelims: + myenvironment: 1 +verbatimEnvironments: + myenvironment: 1 +\end{yaml} +This is quite a significant conflict-- we are first of all telling \lstinline!latexindent.pl! +to look for alignment delimiters in \lstinline!myenvironment! and then +telling it that actually we would like \lstinline!myenvironment! to be considered +as a \lstinline!verbatim!-like environment. Regardless of the order that we +state \cref{lst:bigconflict} the \lstinline!verbatim! instruction will always win. +As in \cref{lst:conflict} you will only receive a warning in \lstinline!indent.log! the +first time \lstinline!latexindent.pl! encounters \lstinline!myenvironment! as the +offending key is deleted from \lstinline!lookForAlignDelims!. + +To summarize, \lstinline!latexindent.pl! will prioritize the various fields in the +following order: +\begin{enumerate} + \item \lstinline!verbatimEnvironments! + \item \lstinline!noAdditionalIndent! + \item \lstinline!indentRules! +\end{enumerate} +\subsection{\lstinline!indentconfig.yaml! (for user settings)}\label{sec:indentconfig} +Editing \lstinline!defaultSettings.yaml! is not ideal as it may be overwritten when +updating your distribution-- a better way to customize the settings to your liking +is to set up your own settings file, +\lstinline!mysettings.yaml! (or any name you like, provided it ends with \lstinline!.yaml!). +The only thing you have to do is tell \lstinline!latexindent.pl! where to find it. + +\lstinline!latexindent.pl! will always check your home directory for \lstinline!indentconfig.yaml! (unless +it is called with the \lstinline!-d! switch), +which is a plain text file you can create that contains the \emph{absolute} +paths for any settings files that you wish \lstinline!latexindent.pl! to load. +Note that Mac and Linux users home directory is \lstinline!~/username! while +Windows (Vista onwards) is \lstinline!C:\Users\username! \footnote{If you're not sure + where to put \lstinline!indentconfig.yaml!, don't + worry \lstinline!latexindent.pl! will tell you in the log file exactly where to +put it assuming it doesn't exist already.} +\Cref{lst:indentconfig} shows a sample \lstinline!indentconfig.yaml! file. + +\begin{yaml}[caption={\lstinline!indentconfig.yaml! (sample)},label={lst:indentconfig}] +# Paths to user settings for latexindent.pl +# +# Note that the settings will be read in the order you +# specify here- each successive settings file will overwrite +# the variables that you specify + +paths: +- /home/cmhughes/Documents/yamlfiles/mysettings.yaml +- /home/cmhughes/folder/othersettings.yaml +- /some/other/folder/anynameyouwant.yaml +- C:\Users\chughes\Documents\mysettings.yaml +- C:\Users\chughes\Desktop\test spaces\more spaces.yaml +\end{yaml} + +Note that the \lstinline!.yaml! files you specify in \lstinline!indentconfig.yaml! +will be loaded in the order that you write them in. Each file doesn't have +to have every switch from \lstinline!defaultSettings.yaml!; in fact, I recommend +that you only keep the switches that you want to \emph{change} in these +settings files. + +To get started with your own settings file, you might like to save a copy of +\lstinline!defaultSettings.yaml! in another directory and call it, for +example, \lstinline!mysettings.yaml!. Once you have added the path to \lstinline!indentconfig.yaml! +feel free to start changing the switches and adding more environments to it +as you see fit-- have a look at \cref{lst:mysettings} for an example +that uses four tabs for the default indent, and adds the \lstinline!tabbing! +environment to the list of environments that contains alignment delimiters. + +\begin{yaml}[caption={\lstinline!mysettings.yaml! (example)},label={lst:mysettings}] +# Default value of indentation +defaultIndent: "\t\t\t\t" + +# environments that have tab delimiters, add more +# as needed +lookForAlignDelims: + tabbing: 1 +\end{yaml} + +You can make sure that your settings are loaded by checking \lstinline!indent.log! +for details-- if you have specified a path that \lstinline!latexindent.pl! doesn't +recognize then you'll get a warning, otherwise you'll get confirmation that +\lstinline!latexindent.pl! has read your settings file \footnote{Windows users + may find that they have to end \lstinline!.yaml! files with a blank line}. + +\begin{warning} + When editing \lstinline!.yaml! files it is \emph{extremely} important + to remember how sensitive they are to spaces. I highly recommend copying + and pasting from \lstinline!defaultSettings.yaml! when you create your + first \lstinline!whatevernameyoulike.yaml! file. + + If \lstinline!latexindent.pl! can not read your \lstinline!.yaml! file it + will tell you so in \lstinline!indent.log!. +\end{warning} + +\subsection{\lstinline!localSettings.yaml!} +You may remember on \cpageref{page:localswitch} we discussed the \lstinline!-l! switch +that tells \lstinline!latexindent.pl! to look for \lstinline!localSettings.yaml! in the +\emph{same directory} as \lstinline!myfile.tex!. This settings file will +be read \emph{after} \lstinline!defaultSettings.yaml! and, assuming they exist, +user settings. + +In contrast to the \emph{user} settings which can be named anything you like (provided that +they are detailed in \lstinline!indentconfig.yaml!), the \emph{local} settings file +must be called \lstinline!localSettings.yaml!. It can contain any switches that you'd +like to change-- a sample is shown in \cref{lst:localSettings}. + +\begin{yaml}[caption={\lstinline!localSettings.yaml! (example)},label={lst:localSettings}] +# Default value of indentation +defaultIndent: " " + +# environments that have tab delimiters, add more +# as needed +lookForAlignDelims: + tabbing: 0 + +# verbatim environments- environments specified +# in this hash table will not be changed at all! +verbatimEnvironments: + cmhenvironment: 0 +\end{yaml} + +You can make sure that your local settings are loaded by checking \lstinline!indent.log! +for details-- if \lstinline!localSettings.yaml! can not be read then you will +get a warning, otherwise you'll get confirmation that +\lstinline!latexindent.pl! has read \lstinline!localSettings.yaml!. + +\subsection{Settings load order}\label{sec:loadorder} +\lstinline!latexindent.pl! loads the settings files in the following order: +\begin{enumerate} + \item \lstinline!defaultSettings.yaml! (always loaded, can not be renamed) + \item \lstinline!anyUserSettings.yaml! (and any other arbitrarily-named files specified in \lstinline!indentconfig.yaml!) + \item \lstinline!localSettings.yaml! (if found in same directory as \lstinline!myfile.tex! and called + with \lstinline!-l! switch; can not be renamed) +\end{enumerate} +A visual representation of this is given in \cref{fig:loadorder}. + +\begin{figure} + \centering + \begin{tikzpicture}[ + needed/.style={very thick, draw=blue,fill=blue!20, + text centered, minimum height=2.5em,rounded corners=1ex}, + optional/.style={draw=black, very thick,scale=0.8, + text centered, minimum height=2.5em,rounded corners=1ex}, + optionalfill/.style={fill=black!10}, + connections/.style={draw=black!30,dotted,line width=3pt,text=red}, + ] + % Draw diagram elements + \node (latexindent) [needed,circle] {\lstinline!latexindent.pl!}; + \node (default) [needed,above right=.5cm of latexindent] {\lstinline!defaultSettings.yaml!}; + \node (indentconfig) [optional,right=of latexindent] {\lstinline!indentconfig.yaml!}; + \node (any) [optional,optionalfill,above right=of indentconfig] {\lstinline!any.yaml!}; + \node (name) [optional,optionalfill,right=of indentconfig] {\lstinline!name.yaml!}; + \node (you) [optional,optionalfill,below right=of indentconfig] {\lstinline!you.yaml!}; + \node (want) [optional,optionalfill,below=of indentconfig] {\lstinline!want.yaml!}; + \node (local) [optional,below=of latexindent] {\lstinline!localSettings.yaml!}; + % Draw arrows between elements + \draw[connections,solid] (latexindent) to[in=-90]node[pos=0.5,anchor=north]{1} (default.south) ; + \draw[connections,optional] (latexindent) -- node[pos=0.5,anchor=north]{2} (indentconfig) ; + \draw[connections,optional] (indentconfig) to[in=-90] (any.south) ; + \draw[connections,optional] (indentconfig) -- (name) ; + \draw[connections,optional] (indentconfig) to[out=-45,in=90] (you) ; + \draw[connections,optional] (indentconfig) -- (want) ; + \draw[connections,optional] (latexindent) -- node[pos=0.5,anchor=west]{3} (local) ; + \end{tikzpicture} + \caption{Schematic of the load order described in \cref{sec:loadorder}; solid lines represent + mandatory files, dotted lines represent optional files. \lstinline!indentconfig.yaml! can + contain as many files as you like-- the files will be loaded in order; if you specify + settings for the same field in more than one file, the most recent takes priority. } + \label{fig:loadorder} +\end{figure} + +\subsection{An important example} +I was working on a document that had the text shown in \cref{lst:casestudy}. +\begin{lstlisting}[caption={When to set \lstinline!alwaysLookforSplitBrackets=0!},label={lst:casestudy},escapeinside={(*@}{@*)}] +Hence determine how many zeros the function $h(x)=f(x)-g(x)$ +has on the interval $[0,9)$.(*@\label{line:interval1}@*) +\begin{shortsolution} + The function $h$ has $10$ zeros on the interval $[0,9)$.(*@\label{line:interval2}@*) +\end{shortsolution} +\end{lstlisting} +I had allowed \lstinline!alwaysLookforSplitBrackets=1!, which is the default setting. +Unfortunately, this caused undesired results, as \lstinline!latexindent.pl! thought that the opening +\lstinline![! in the interval notation (\cref{line:interval1,line:interval2}) +was an opening brace that needed to be closed (with a corresponding \lstinline!]!). Clearly +this was inappropriate, but also expected since \lstinline!latexindent.pl! was simply +following its matching rules. + +In this particular instance, I set up \lstinline!localSettings.yaml! +to contain \lstinline!alwaysLookforSplitBrackets: 0! and then specified the commands +that could split brackets across lines (such as \lstinline!begin{axis}!) individually +in \lstinline!checkunmatchedbracket!. Another option would have been to wrap the +the line in an environment from \lstinline!noIndentBlock! which treats its contents +as a verbatim environment. + + +\section{Known limitations}\label{sec:knownlimitations} +There are a number of known limitations of the script, and almost certainly quite a +few that are \emph{unknown}! + +The main limitation is to do with the alignment routine of environments that contain +delimiters-- in other words, environments that are entered in \lstinline!lookForAlignDelims!. +Indeed, this is the only part of the script that can \emph{potentially} remove +lines from \lstinline!myfile.tex!. Note that \lstinline!indent.log! will always +finish with a comparison of line counts before and after. + +The routine works well for `standard' blocks of code that have the same number of \lstinline!&! +per line, but it will not do anything for blocks that do not-- such examples +include \lstinline!tabular! environments that use \lstinline!\multicolumn! or +perhaps spread cell contents across multiple lines. For each alignment block (\lstinline!tabular!, +\lstinline!align!, etc) \lstinline!latexindent.pl! first of all makes a record +of the maximum number of \lstinline!&!; if each row does not have that +number of \lstinline!&! then it will not try to format that row. Details +will be given in \lstinline!indent.log! assuming that \lstinline!trace! mode +is active. + +If you have a \lstinline!verbatim!-like environment inside a \lstinline!tabular!-like +environment, the \lstinline!verbatim! environment \emph{will} be formatted, which +is probably not what you want. I hope to address this in future versions, but for the +moment wrap it in a \lstinline!noIndentBlock! (see \cpageref{lst:noIndentBlockdemo}). + +I hope that this script is useful to some-- if you find an example where the +script does not behave as you think it should, feel free to e-mail me or else +come and find me on the \url{http://tex.stackexchange.com} site; I'm often around +and in the chat room. + +\printbibliography[heading=bibintoc] + +\appendix +\section{Required \lstinline!Perl! modules}\label{sec:requiredmodules} +If you intend to use \lstinline!latexindent.pl! and \emph{not} one of the supplied standalone executable files, then you will need a few standard Perl modules-- if you can run the +minimum code in \cref{lst:helloworld} (\lstinline!perl helloworld.pl!) then you will be able to run \lstinline!latexindent.pl!, otherwise you may +need to install the missing modules. + +\begin{lstlisting}[language=Perl,caption={\lstinline!helloworld.pl!},label={lst:helloworld}] +#!/usr/bin/perl + +use strict; +use warnings; +use FindBin; +use YAML::Tiny; +use File::Copy; +use File::Basename; +use Getopt::Std; +use File::HomeDir; + +print "hello world"; +exit; +\end{lstlisting} +My default installation on Ubuntu 12.04 did \emph{not} come +with all of these modules as standard, but Strawberry Perl for Windows \cite{strawberryperl} +did. + +Installing the modules given in \cref{lst:helloworld} will vary depending on your +operating system and \lstinline!Perl! distribution. For example, Ubuntu users +might visit the software center, and Strawberry Perl users on Windows might use +\lstinline!CPAN client!. All of the modules are readily available on CPAN \cite{cpan}. + +\section{The \lstinline!arara! rule} +The \lstinline!arara! rule (\lstinline!indent.yaml!) contains lines such as those +given in \cref{lst:arararule}. With this setup, the user \emph{always} has +to specify whether or not they want (in this example) to use the \lstinline!trace! +identifier. +\begin{yaml}[caption={The \lstinline!arara! rule},label={lst:arararule},numbers=none] +... +arguments: +- identifier: trace + flag: <arara> @{ isTrue( parameters.trace, "-t" ) } +... +\end{yaml} + +If you would like to have the \lstinline!trace! option on by default every time you +call \lstinline!latexindent.pl! from \lstinline!arara! (without having to write \lstinline!% arara: indent: {trace: yes}!), then simply +amend \cref{lst:arararule} so that it looks like \cref{lst:arararulemod}. +\begin{yaml}[caption={The \lstinline!arara! rule (modified)},label={lst:arararulemod},numbers=none] +... +arguments: +- identifier: trace + flag: <arara> @{ isTrue( parameters.trace, "-t" ) } + default: "-t" +... +\end{yaml} + +With this modification in place, you now simply to write \lstinline!% arara: indent! and +\lstinline!trace! mode will be activated by default. If you wish to turn off \lstinline!trace! +mode then you can write \lstinline!% arara: indent: {trace: off}!. + +Of course, you can apply these types of modifications to \emph{any} of the identifiers, +but proceed with caution if you intend to do this for \lstinline!overwrite!. + +\end{document} diff --git a/Master/texmf-dist/doc/support/latexindent/indent.yaml b/Master/texmf-dist/doc/support/latexindent/indent.yaml new file mode 100644 index 00000000000..0db81a066f2 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/indent.yaml @@ -0,0 +1,38 @@ +!config +# indent rule for arara +# author: Paulo Cereda, Chris Hughes +# last updated: 11/9/2013 +# requires arara 3.0+ +# +# Sample usage: +# +# % arara: indent +# % arara: indent: {overwrite: yes} +# % arara: indent: {output: myfile.tex, silent: no} +# % arara: indent: {output: myfile.tex, silent: yes, overwrite: yes} +# % arara: indent: {trace: true} +# % arara: indent: {localSettings: true} +# % arara: indent: {onlyDefault: on} +# % arara: indent: { cruft: /home/cmhughes/Desktop } +# +# Directories with spaces will cause issues in the cruft call. +# +# Note: output will take priority above overwrite +identifier: indent +name: Indent +command: <arara> @{ isWindows( "cmd /c latexindent.exe", "latexindent.pl" ) } @{silent} @{trace} @{localSettings} @{cruft}@{ isNotEmpty( cruft, '="'.concat(parameters.cruft).concat('"') ) } @{overwrite} @{onlyDefault} @{output} "@{file}" @{ isNotEmpty( output, '"'.concat(parameters.output).concat('"') ) } +arguments: +- identifier: overwrite + flag: <arara> @{ isTrue( parameters.overwrite, "-w" ) } +- identifier: silent + flag: <arara> @{ isTrue( parameters.silent, "-s" ) } +- identifier: trace + flag: <arara> @{ isTrue( parameters.trace, "-t" ) } +- identifier: localSettings + flag: <arara> @{ isTrue( parameters.localSettings, "-l" ) } +- identifier: output + flag: <arara> @{ isNotEmpty( parameters.output, "-o" ) } +- identifier: onlyDefault + flag: <arara> @{ isTrue( parameters.onlyDefault, "-d" ) } +- identifier: cruft + flag: <arara> @{ isNotEmpty( parameters.cruft, "-c" ) } diff --git a/Master/texmf-dist/doc/support/latexindent/success/bigTest.tex b/Master/texmf-dist/doc/support/latexindent/success/bigTest.tex new file mode 100644 index 00000000000..0e47c4a2cf2 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/bigTest.tex @@ -0,0 +1,293 @@ +% arara: indent: {trace: true} +\documentclass[10pt,twoside]{report} +\begin{document} + +% needed for the mini-tableofcontents +\dominitoc +\faketableofcontents + +\fancyhf{} % delete current header and footer +\fancyhead[LE,RO]{\bfseries\thepage} +\fancyhead[LO,RE]{\tiny\rightmark} +\fancyheadoffset[LE,LO]{4cm} + +\pagestyle{fancy} +%\include{coverpage} +\include{functions} +%\include{exponentialfunctions} +%\include{functions2} +%\include{logarithms} +%\include{polyrat} +%\include{ideas} + +%======================= +% BEGIN SOLUTIONS +%======================= + +% change the page geometry using \newgeometry +%\cleardoublepage +\clearpage +%\setbool{@twoside}{false} +\fancyheadoffset[RE,RO]{2cm} +\fancyheadoffset[LE,LO]{1cm} +\renewcommand{\rightmark}{Solutions to Section \thesection} +\fancyhead[LO,RE]{\rightmark} +\newgeometry{left=4cm,right=4cm,showframe=true, + marginratio=1:1, + top=1.5cm,bottom=1.5cm,bindingoffset=0cm} + +% finish the php file +\Writetofile{crossrefsWEB}{?>} + +% close the solutions files +\Closesolutionfile{shortsolutions} +\Closesolutionfile{longsolutions} +%\Closesolutionfile{hints} +\Closesolutionfile{crossrefsWEB} + +% when itemized lists are used in the solutions, they +% are actually at 2nd depth because the solution environment +% uses an \itemize environment to get the indendation correct +\setlist[itemize,2]{label=\textbullet} + +% SHORT solution to problem (show only odd, even, all) +% Note: this renewenvironment needs to go here +% so that the answers package can still +% display correctly to the page if needed +\newbool{oddproblemnumber} +\renewenvironment{shortSoln}[1]{% + \exploregroups % needed to ignore {} + % before the environment starts - this is a stretchable space + \vskip 0.1cm plus 2cm minus 0.1cm% + \fullexpandarg % need this line so that '.' are counted + % + % either problems, or subproblems, e.g: 3.1 or 3.1.4 respectively + % determine which one by counting the '.' + \StrCount{#1}{.}[\numberofdecimals] + % + % find the problem number by splitting the string + \ifnumequal{\numberofdecimals}{0}% + {% + % problems, such as 4, 5, 6, ... + \def\problemnumber{#1}% + }% + {}% + \ifnumequal{\numberofdecimals}{1}% + {% + % subproblems, such as 4.3, 1.2, 10.5 + \StrBefore{#1}{.}[\problemnumber]% + }% + {}% + \ifnumequal{\numberofdecimals}{2}% + {% + % subproblems such as 1.3.1, 1.2.4, 7.5.6 + % note that these aren't currently used, but maybe someday + \StrBehind{#1}{.}[\newbit]% + \StrBefore{\newbit}{.}[\problemnumber]% + }% + {}% + % + % determine if the problem number is odd or even + % and depending on our choices above, display or not + \ifnumodd{\problemnumber}% + {% + % set a boolean that says the problem number is odd (used later) + \setbool{oddproblemnumber}{true}% + % display or not + \ifbool{showoddsolns}% + {% + % if we want to show the odd problems + \ifbool{coreproblemYesNo}% + {% Core problem + \expandafter\itemize[label=\llap{$\bigstar$ }\bfseries \hyperlink{prob:#1:\thechapter:\thesection}{#1}.]\item% + }% + {% NOT Core problem + \expandafter\itemize[label=\bfseries \hyperlink{prob:#1:\thechapter:\thesection}{#1}.]\item% + }% + }% + {% + % otherwise don't show them! + \expandafter\comment% + }% + }% + {% + % even numbered problem, set the boolean (used later) + \setbool{oddproblemnumber}{false}% + \ifbool{showevensolns}% + {% + % if we want to show the even problems + \ifbool{coreproblemYesNo}% + {% Core problem + \expandafter\itemize[label=\llap{$\bigstar$ }\itshape \hyperlink{prob:#1:\thechapter:\thesection}{#1}.]\item% + }% + {% NOT Core problem + \expandafter\itemize[label=\itshape \hyperlink{prob:#1:\thechapter:\thesection}{#1}.]\item% + }% + }% + {% + % otherwise don't show them! + \expandafter\comment% + }% + }% +}% +{% + % after the environment finishes + \ifbool{oddproblemnumber}% + {% + % odd numbered problems + \ifbool{showoddsolns}% + {% + % if we want to show the odd problems + % then the environment is finished + \enditemize% + }% + {% + % otherwise we need to finish the comment + \expandafter\endcomment% + }% + }% + {% + % even numbered problems + \ifbool{showevensolns}% + {% + % if we want to show the even problems + % then the environment is finished + \enditemize% + }% + {% + % otherwise we need to finish the comment + \expandafter\endcomment% + }% + }% +} + +% LONG solution to problem (show only odd, even, all) +% Note: this renewenvironment needs to go here +% so that the answers package can still +% display correctly to the page if needed +\renewenvironment{longSoln}[1]{% + \exploregroups % needed to ignore {} + % before the environment starts - this is a stretchable space + \vskip 0.1cm plus 2cm minus 0.1cm% + \fullexpandarg % need this line so that '.' are counted + % + % either problems, or subproblems, e.g: 3.1 or 3.1.4 respectively + % determine which one by counting the '.' + \StrCount{#1}{.}[\numberofdecimals] + % + % find the problem number by splitting the string + \ifnumequal{\numberofdecimals}{0}% + {% + % problems, such as 4, 5, 6, ... + \def\problemnumber{#1}% + }% + {}% + \ifnumequal{\numberofdecimals}{1}% + {% + % problems, such as 4.3, 1.2, 10.5 + \StrBefore{#1}{.}[\problemnumber]% + }% + {}% + \ifnumequal{\numberofdecimals}{2}% + {% + % subproblems such as 1.3.1, 1.2.4, 7.5.6 + \StrBehind{#1}{.}[\newbit]% + \StrBefore{\newbit}{.}[\problemnumber]% + }% + {}% + % + % determine if the problem number is odd or even + % and depending on our choices above, display or not + \ifnumodd{\problemnumber}% + {% + % set a boolean that says the problem number is odd (used later) + \setbool{oddproblemnumber}{true}% + % display or not + \ifbool{showoddsolns}% + {% + % if we want to show the odd problems + {\bfseries \hyperlink{prob:#1:\thechapter:\thesection}{#1}.}% + }% + {% + % otherwise don't show them! + \expandafter\comment% + }% + }% + {% + % even numbered problem, set the boolean (used later) + \setbool{oddproblemnumber}{false}% + \ifbool{showevensolns}% + {% + % if we want to show the even problems + {\itshape \hyperlink{prob:#1:\thechapter:\thesection}{#1}.}% + }% + {% + % otherwise don't show them! + \expandafter\comment% + }% + }% +}% +{% + % after the environment finishes + \ifbool{oddproblemnumber}% + {% + % odd numbered problems + \ifbool{showoddsolns}% + {% + % if we want to show the odd problems + % then the environment is finished + }% + {% + % otherwise we need to finish the comment + \expandafter\endcomment% + }% + }% + {% + % even numbered problems + \ifbool{showevensolns}% + {% + % if we want to show the even problems + % then the environment is finished + }% + {% + % otherwise we need to finish the comment + \expandafter\endcomment% + }% + }% +} + +% renew tikzpicture environment to make it use valign=t +% on every one, which fixes vertical alignment of tikzpicture +% with the solution label: http://tex.stackexchange.com/questions/30367/aligning-enumerate-labels-to-top-of-image +\BeforeBeginEnvironment{tikzpicture}{\begin{adjustbox}{valign=t}} +\AfterEndEnvironment{tikzpicture}{\end{adjustbox}} + +% do the same for the tabular environment +\BeforeBeginEnvironment{tabular}{\begin{adjustbox}{valign=t}} +\AfterEndEnvironment{tabular}{\end{adjustbox}} + +% set every picture in the solutions to have \solutionfigurewidth +\pgfplotsset{ + every axis/.append style={% + width=\solutionfigurewidth}} + +% input the SHORT solutions file +\IfFileExists{shortsolutions.tex}{\input{shortsolutions.tex}}{} + +\clearpage +% input the LONG solutions file +%\IfFileExists{longsolutions.tex}{\input{longsolutions.tex}}{} + +\clearpage +% input the HINTS file +%\IfFileExists{hints.tex}{\input{hints.tex}}{} +%======================= +% END SOLUTIONS +%======================= + +%======================= +% INDEX +%======================= +\printindex + +\end{document} diff --git a/Master/texmf-dist/doc/support/latexindent/success/braceTest.tex b/Master/texmf-dist/doc/support/latexindent/success/braceTest.tex new file mode 100644 index 00000000000..2fd9e34a10f --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/braceTest.tex @@ -0,0 +1,57 @@ +% arara: indent: { overwrite: false, output: outputfile.tex } + +\hypersetup{% +pdfstartview={% +FitH \hypercalcbp{\paperheight-\topmargin-0in +-\headheight-\headsep +} +}% +%--------------------------------------------------------------------------- +} + +some other text +some other text +some other text + +\hypersetup{% +pdfstartview={% +FitH \hypercalcbp{\paperheight-\topmargin-0in +-\headheight-\headsep +} +}} + +some other text +some other text +some other text + +\hypersetup{% +pdfstartview={% +FitH \hypercalcbp{\paperheight-\topmargin-0in +-\headheight-\headsep +}}} + +some other text +some other text +some other text + + +\hypersetup{% +pdfstartview={% +FitH \hypercalcbp{\paperheight-\topmargin-0in +-\headheight-\headsep +}} +} + +some other text +some other text +some other text + +\parbox{ +\begin{something} + +\end{something} +} + +some other text +some other text +some other text diff --git a/Master/texmf-dist/doc/support/latexindent/success/braceTestsmall.tex b/Master/texmf-dist/doc/support/latexindent/success/braceTestsmall.tex new file mode 100644 index 00000000000..48ddbf68ae6 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/braceTestsmall.tex @@ -0,0 +1,31 @@ +% arara: indent: {trace: on} +\hypersetup{% +pdfstartview={% +FitH \hypercalcbp{\paperheight-\topmargin-0in +-\headheight-\headsep }% +}% +%--------------------------------------------------------------------------- +} + +some other text +some other text +some other text + +\hypersetup{% +pdfstartview={% +FitH \hypercalcbp{\paperheight-\topmargin-0in +-\headheight-\headsep }}% +} + +some other text +some other text +some other text + +\hypersetup{% +pdfstartview={\someothercommand{here}% +FitH \hypercalcbp{\paperheight-\topmargin-0in +-\headheight-\headsep }}} + +some other text +some other text +some other text diff --git a/Master/texmf-dist/doc/support/latexindent/success/environments.tex b/Master/texmf-dist/doc/support/latexindent/success/environments.tex new file mode 100644 index 00000000000..b33d9982896 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/environments.tex @@ -0,0 +1,38 @@ +% arara: indent: { cruft: /home/cmhughes/Desktop/tmp/, overwrite: on, trace: yes, silent: yes, onlyDefault: no} +some +other +text +\begin{enumerate} + \item $3x^3y(-4x^3+y) = -12x^6y+3x^3y^2$ + \item $3x^3+y(-4x^3+y) = 3x^3-4x^3y+y^2$ + \item \begin{align*} + {\color{red}(3x^3+y)}(-4x^3+y) & = {\color{red}(3x^3+y)}(-4x^3)+{\color{red}(3x^3+y)}(y) \\ + & = -12x^6-4x^3y+3x^3y+y^2 \\ + & = -12x^6-x^3y+y^2 + \end{align*} +\end{enumerate} +\begin{enumerate} + \item $3x^3y(-4x^3+y) = -12x^6y+3x^3y^2$ + \item $3x^3+y(-4x^3+y) = 3x^3-4x^3y+y^2$ + \item + \begin{align*} + {\color{red}(3x^3+y)}(-4x^3+y) & = {\color{red}(3x^3+y)}(-4x^3)+{\color{red}(3x^3+y)}(y) \\ + & = -12x^6-4x^3y+3x^3y+y^2 \\ + & = -12x^6-x^3y+y^2 + \end{align*} +\end{enumerate} + +\begin{something} + \begin{else} + again + \end{else} +\end{something} +no +environments +here +\[ x^2+ 3x\] +other text +\[ + x^2+ 3x +\] +other text diff --git a/Master/texmf-dist/doc/support/latexindent/success/filecontents.tex b/Master/texmf-dist/doc/support/latexindent/success/filecontents.tex new file mode 100644 index 00000000000..d6132684232 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/filecontents.tex @@ -0,0 +1,73 @@ +% arara: indent: {overwrite: true, trace: false, localSettings: yes} + +% used with localSettings.yaml as follows +%indentPreamble: 1 +%indentRules: +% @online: "\t\t\t\t" +% #myenvironment: "\t\t" +% myotherenvironment: "\t\t" +% \[: "\t\t" +% tabular: "\t\t\t" +%noAdditionalIndent: +% @online: 0 +% myotherenvironment: 1 +% \[: 0 +% \]: 0 +% tabular: 0 +% something: 0 +% parbox: 1 +%verbatimEnvironments: +% myotherenvironment: 1 +% tabular: 0 +% someothername: 0 + + +% \begin{noindent} +here we are in a block +% \end{noindent} +some more +\begin{tabular}{cccc} + 1 & 2 & 3 & 4 \\ + 5 & & 6 & \\ +\end{tabular} + +another test +\begin{tabular}{cccc} + 1 & 2 & 3 & 4 \\ + 5 & & 6 & \\ +\end{tabular} + +\begin{something} + \parbox{something + else + goes + here + } + some text some text + some text some text + some text some text + \[ + x^2+2x + \] + some text some text + some text some text + some text some text + some text some text + some text some text +\end{something} +\begin{filecontents}{mybib.bib} + @online{strawberryperl, + title="Strawberry Perl", + url="http://strawberryperl.com/"} + @online{cmhblog, + title="A Perl script for indenting tex files", + url="http://tex.blogoverflow.com/2012/08/a-perl-script-for-indenting-tex-files/"} +\end{filecontents} + +\begin{myotherenvironment} + some text goes here + some text goes here + some text goes here + some text goes here +\end{myotherenvironment} + diff --git a/Master/texmf-dist/doc/support/latexindent/success/matrix.tex b/Master/texmf-dist/doc/support/latexindent/success/matrix.tex new file mode 100644 index 00000000000..3d60ebc3905 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/matrix.tex @@ -0,0 +1,14 @@ +% arara: indent: {overwrite: true, trace: true} +\[ + \begin{matrix}[cc|cccccc|c] + & & & & & & {\color{blue}\downarrow} & {\color{blue}\downarrow} & S \\\hline + & 6 & {\color{red}\newmoon} & & & & & & {\color{red}\leftarrow} \\ + {\color{blue}*} & 5 & & & & & & {\color{blue}\newmoon} & \\ + & 4 & & & & {\color{red}\newmoon} & & & {\color{red}\leftarrow} \\ + & 3 & & {\color{red}\newmoon} & & & & & {\color{red}\leftarrow} \\ + & 2 & & & \fullmoon & & & & \\ + {\color{blue}*} & 1 & & & & & {\color{blue}\newmoon} & & \\\hline + & & 1 & 2 & 3 & 4 & 5 & 6 & \\ + \% & & {\color{red}*} & {\color{red}*} & & {\color{red}*} & & & + \end{matrix} +\] diff --git a/Master/texmf-dist/doc/support/latexindent/success/nestedalignment.tex b/Master/texmf-dist/doc/support/latexindent/success/nestedalignment.tex new file mode 100644 index 00000000000..2f6afd65169 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/nestedalignment.tex @@ -0,0 +1,33 @@ +% arara: indent: { overwrite: on, trace: yes} +\begin{tabular}{p{3cm}|c|p{8cm}} + Example & Choice & Why \\ \hline \hline + \( + \left\{ + \begin{array}{rl} + x+y & =6 \\ + 2x+y & =8 + \end{array} + \right. + \) + & Substitution {\em or }Addition & Because it is easy to solve for $x$ in the 1st equation + {\em or} + Because it is easy to multiply the first equation by -1 \\ \hline + \( + \left\{ + \begin{array}{rl} + 3x-7y & =13 \\ + 6x+5y & =7 + \end{array} + \right. + \) + & Addition & Because there is no obvious way to use substitution \\ \hline + \( + \left\{ + \begin{array}{rl} + x-7y & =13 \\ + 6x+5y & =7 + \end{array} + \right. + \) + & Substitution & Because the first equation can easily be solved for one of the variables +\end{tabular} diff --git a/Master/texmf-dist/doc/support/latexindent/success/nestedalignment1.tex b/Master/texmf-dist/doc/support/latexindent/success/nestedalignment1.tex new file mode 100644 index 00000000000..54a012f8e2b --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/nestedalignment1.tex @@ -0,0 +1,25 @@ +% arara: indent: { overwrite: on, silent: no, trace: yes} +\begin{tabular}{p{3cm}|c|p{8cm}} + x+y & = & 6 \\ + 2x+y & \&\%=8 % \% & + \%\&\%\% & & \\ % & & 2x+y & =8 + x+y & = & 6 \\ + 2x+y & =8 + 2x+y \&\& & = & 8 % trailine comment +\end{tabular} + +here's another line $\{ x^2 + 5x \}$ +\begin{minipage}{\textwidth} + content + content + content + content + content +\end{minipage}\\[3cm] +\begin{minipage}{\textwidth} + content + content + content + content + content +\end{minipage}\\[3cm] diff --git a/Master/texmf-dist/doc/support/latexindent/success/outputfile.tex b/Master/texmf-dist/doc/support/latexindent/success/outputfile.tex new file mode 100644 index 00000000000..71278475a00 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/outputfile.tex @@ -0,0 +1,57 @@ +% arara: indent: { overwrite: false, output: outputfile.tex } + +\hypersetup{% + pdfstartview={% + FitH \hypercalcbp{\paperheight-\topmargin-0in + -\headheight-\headsep + } + }% + %--------------------------------------------------------------------------- +} + +some other text +some other text +some other text + +\hypersetup{% + pdfstartview={% + FitH \hypercalcbp{\paperheight-\topmargin-0in + -\headheight-\headsep + } +}} + +some other text +some other text +some other text + +\hypersetup{% + pdfstartview={% + FitH \hypercalcbp{\paperheight-\topmargin-0in + -\headheight-\headsep +}}} + +some other text +some other text +some other text + + +\hypersetup{% + pdfstartview={% + FitH \hypercalcbp{\paperheight-\topmargin-0in + -\headheight-\headsep + }} +} + +some other text +some other text +some other text + +\parbox{ + \begin{something} + + \end{something} +} + +some other text +some other text +some other text diff --git a/Master/texmf-dist/doc/support/latexindent/success/preamble.tex b/Master/texmf-dist/doc/support/latexindent/success/preamble.tex new file mode 100644 index 00000000000..666277aa88f --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/preamble.tex @@ -0,0 +1,29 @@ +% arara: indent: {trace: on} +\documentclass[10pt,twoside]{report} +\newenvironment{widepage}{\begin{adjustwidth}{-\offsetpage}{}% + \addtolength{\textwidth}{\offsetpage}}% +{\end{adjustwidth}} + +% Define fix command +% - it puts a comment in the margin +% - it writes to a file with a list of things that need fixing +\newcommand{\fixthis}[1] +{% + \marginpar{\huge \color{red} \framebox{FIX}}% + \typeout{FIXTHIS: p\thepage : #1^^J}% +} + +% Define pccname command +% - it writes to the log file with a detail of the name- +% this is useful for tracking names for diversity purposes +\newcommand{\pccname}[1] +{% + #1% + \typeout{PCCNAME: p\thepage : #1}% +} + +\begin{document} + +some text + +\end{document} diff --git a/Master/texmf-dist/doc/support/latexindent/success/pstricks1.tex b/Master/texmf-dist/doc/support/latexindent/success/pstricks1.tex new file mode 100644 index 00000000000..2dfed9849f1 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/pstricks1.tex @@ -0,0 +1,25 @@ +% arara: indent: {overwrite: true, silent: on} +\documentclass[pstricks]{standalone} +\usepackage{pstricks,multido} + +\def\Bottle#1{{\pscustom[linewidth=2pt]{% + \rotate{#1} + \psline(-1,3.5)(-1,4)(1,4)(1,3.5) + \pscurve(3,2)(1,0)\psline(-1,0) + \pscurve(-3,2)(-1,3.5)}}} + +\def\BottleWithWater(#1)#2{% + \rput[c]{#2}(#1){% + \rput{*0}(0,0){% + \psclip{\Bottle{#2}} + \psframe*[linecolor=gray](-6,-2)(6,2) + \endpsclip}\rput{*0}(0,0){\Bottle{#2}}}} + +\begin{document} + +\multido{\iA=-45+5}{19}{% + \begin{pspicture}(-2.5,-0.5)(6,5.5) + \BottleWithWater(1.5,1){\iA} + \end{pspicture}} + +\end{document} diff --git a/Master/texmf-dist/doc/support/latexindent/success/pstricks2.tex b/Master/texmf-dist/doc/support/latexindent/success/pstricks2.tex new file mode 100644 index 00000000000..7690da820e7 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/pstricks2.tex @@ -0,0 +1,68 @@ +% arara: indent: {overwrite: true, trace: true, localSettings: off} +\documentclass[pstricks,border=12pt]{standalone} +\usepackage{pst-eucl} +\usepackage[nomessages]{fp} + +\definecolor{myblue}{RGB}{37,111,197} +\definecolor{mybrown}{RGB}{211,200,134} + +\def\rOne{0.75} +\def\rTwo{0.75} +\def\tOne{20} +\def\tTwo{-45} +\FPset\RowMaxIndex{4}% because zero based index +\FPset\ColMaxIndex{4}% because zero based index + + +\psset +{ + PointName=none, + PointSymbol=none, + fillstyle=solid, + linejoin=1, +} + +\def\Bar(#1,#2)#3{% + \rput(!#2 \rTwo\space mul \tTwo\space PtoC){% + \rput(!#1 \rOne\space mul \tOne\space 180 add PtoC){% + \pstGeonode{O}(\rOne;\tOne){One}(\rTwo;\tTwo){Two} + \pstTranslation{O}{Two}{One}[Three] + \pnode(0,\stripH){O'} + \pstTranslation{O}{O'}{One,Two,Three} + \pnode(0,#3){O''} + \pstTranslation{O}{O''}{One,Two,Three}[One'',Two'',Three''] + \psset{fillcolor=mybrown} + \pspolygon(O'')(O)(Two)(Two'') + \pspolygon(Two'')(Two)(Three)(Three'') + \pspolygon(One'')(O'')(Two'')(Three'') + \psset{fillcolor=myblue,opacity=0.75,linestyle=none,linewidth=0} + \FPifeq{#1}{\RowMaxIndex}\pspolygon(O')(O)(Two)(Two')\fi + \FPifeq{#2}{\ColMaxIndex}\pspolygon(Two')(Two)(Three)(Three')\fi + \FPiflt{#3}{\stripH}\pspolygon(One')(O')(Two')(Three')\fi + }% + }% +} + +\newcount\OuterIndex +\def\SaveListContents#1\relax{\def\Contents{#1}} + +\def\Picture#1{% + \def\stripH{#1}% + \begin{pspicture}[showgrid=false](-2.5,-3.35)(3.05,3.05) + \psforeach{\row}{% + {{3,2.8,2.7,3,3.1}},% <=== Only this row must use double curly braces. It is a feature! + {2.8,1,1.2,2,3},% + {2.8,1,1.2,2,2.8},% + {2.6,1.6,1.8,1.9,1.8},% + {2.4,1.5,1.7,1.9,1.5}% + }{% + \expandafter\SaveListContents\row\relax + \OuterIndex=\psLoopIndex\relax + \psforeach{\col}{\Contents}{\Bar(\the\OuterIndex,\the\psLoopIndex){\col}}% + \psLoopIndex=\OuterIndex\relax + } + \end{pspicture}} + +\begin{document} +\multido{\n=0.0+0.2}{17}{\Picture{\n}} +\end{document} diff --git a/Master/texmf-dist/doc/support/latexindent/success/pstricks3.tex b/Master/texmf-dist/doc/support/latexindent/success/pstricks3.tex new file mode 100644 index 00000000000..09c132f5c73 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/pstricks3.tex @@ -0,0 +1,49 @@ +% arara: indent: {overwrite: yes} +\documentclass[pstricks,border=12pt]{standalone} +\usepackage{pst-node} +\addtopsstyle{gridstyle}{gridlabels=0pt,strokeopacity=.25} + +\begin{document} +\begin{pspicture}[showgrid=top](8,8) + \multips(0,.5)(0,1){8}{% + \multips(.5,0)(1,0){8}{% + \psline[linecolor=red](6pt;-135)(6pt;45) + \psline[linecolor=red](6pt;135)(6pt;-45)}} + \pscustom + [ + dimen=middle, + fillstyle=eovlines*, + fillcolor=white, + hatchcolor=blue, + linecolor=blue, + ] + { + \psframe(8,8) + \pspolygon + (3,1) + (3,4) + (1,4) + (1,6) + (2,6) + (2,7) + (7,7) + (7,4) + (6,4) + (6,6) + (5,6) + (5,4) + (6,4) + (6,3) + (7,3) + (7,1) + (6,1) + (6,2) + (5,2) + (5,1) + } + \psset{linecolor=blue,nodesep=7pt} + \pscircle*(4,2){2pt} + \pscircle*(4,3){2pt} + \pcline(4,2)(4,3) +\end{pspicture} +\end{document} diff --git a/Master/texmf-dist/doc/support/latexindent/success/sampleAFTER.tex b/Master/texmf-dist/doc/support/latexindent/success/sampleAFTER.tex new file mode 100644 index 00000000000..cc7a2b6c4d7 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/sampleAFTER.tex @@ -0,0 +1,5818 @@ +% A sample chapter file- it contains a lot of +% environments, including tabulars, align, etc +% +% Don't try and compile this file using pdflatex etc, just +% compare the *format* of it to the format of the +% sampleAFTER.tex +% +% In particular, compare the tabular and align-type +% environments before and after running the script + +\section{Polynomial functions} +\reformatstepslist{P} % the steps list should be P1, P2, \ldots +In your previous mathematics classes you have studied \emph{linear} and +\emph{quadratic} functions. The most general forms of these types of +functions can be represented (respectively) by the functions $f$ +and $g$ that have formulas +\begin{equation}\label{poly:eq:linquad} + f(x)=mx+b, \qquad g(x)=ax^2+bx+c +\end{equation} +We know that $m$ is the slope of $f$, and that $a$ is the \emph{leading coefficient} +of $g$. We also know that the \emph{signs} of $m$ and $a$ completely +determine the behavior of the functions $f$ and $g$. For example, if $m>0$ +then $f$ is an \emph{increasing} function, and if $m<0$ then $f$ is +a \emph{decreasing} function. Similarly, if $a>0$ then $g$ is +\emph{concave up} and if $a<0$ then $g$ is \emph{concave down}. Graphical +representations of these statements are given in \cref{poly:fig:linquad}. + +\begin{figure}[!htb] + \setlength{\figurewidth}{.2\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-10:8]{(x+2)}; + \end{axis} + \end{tikzpicture} + \caption{$m>0$} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-10:8]{-(x+2)}; + \end{axis} + \end{tikzpicture} + \caption{$m<0$} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-4:4]{(x^2-6)}; + \end{axis} + \end{tikzpicture} + \caption{$a>0$} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-4:4]{-(x^2-6)}; + \end{axis} + \end{tikzpicture} + \caption{$a<0$} + \end{subfigure} + \caption{Typical graphs of linear and quadratic functions.} + \label{poly:fig:linquad} +\end{figure} + +Let's look a little more closely at the formulas for $f$ and $g$ in +\cref{poly:eq:linquad}. Note that the \emph{degree} +of $f$ is $1$ since the highest power of $x$ that is present in the +formula for $f(x)$ is $1$. Similarly, the degree of $g$ is $2$ since +the highest power of $x$ that is present in the formula for $g(x)$ +is $2$. + +In this section we will build upon our knowledge of these elementary +functions. In particular, we will generalize the functions $f$ and $g$ to a function $p$ that has +any degree that we wish. + +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{essentialskills} + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{problem}[Quadratic functions] + Every quadratic function has the form $y=ax^2+bx+c$; state the value + of $a$ for each of the following functions, and hence decide if the + parabola that represents the function opens upward or downward. + \begin{multicols}{2} + \begin{subproblem} + $F(x)=x^2+3$ + \begin{shortsolution} + $a=1$; the parabola opens upward. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $G(t)=4-5t^2$ + \begin{shortsolution} + $a=-5$; the parabola opens downward. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $H(y)=4y^2-96y+8$ + \begin{shortsolution} + $a=4$; the parabola opens upward. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $K(z)=-19z^2$ + \begin{shortsolution} + $m=-19$; the parabola opens downward. + \end{shortsolution} + \end{subproblem} + \end{multicols} + Now let's generalize our findings for the most general quadratic function $g$ + that has formula $g(x)=a_2x^2+a_1x+a_0$. Complete the following sentences. + \begin{subproblem} + When $a_2>0$, the parabola that represents $y=g(x)$ opens $\ldots$ + \begin{shortsolution} + When $a_2>0$, the parabola that represents the function opens upward. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + When $a_2<0$, the parabola that represents $y=g(x)$ opens $\ldots$ + \begin{shortsolution} + When $a_2<0$, the parabola that represents the function opens downward. + \end{shortsolution} + \end{subproblem} + \end{problem} +\end{essentialskills} + +\subsection*{Power functions with positive exponents} +The study of polynomials will rely upon a good knowledge +of power functions| you may reasonably ask, what is a power function? +\begin{pccdefinition}[Power functions] +Power functions have the form +\[ + f(x) = a_n x^n +\] +where $n$ can be any real number. + +Note that for this section we will only be concerned with the +case when $n$ is a positive integer. +\end{pccdefinition} + +You may find assurance in the fact that you are already very comfortable +with power functions that have $n=1$ (linear) and $n=2$ (quadratic). Let's +explore some power functions that you might not be so familiar with. +As you read \cref{poly:ex:oddpow,poly:ex:evenpow}, try and spot +as many patterns and similarities as you can. + +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{pccexample}[Power functions with odd positive exponents] +\label{poly:ex:oddpow} +Graph each of the following functions, state their domain, and their +long-run behavior as $x\rightarrow\pm\infty$ +\[ + f(x)=x^3, \qquad g(x)=x^5, \qquad h(x)=x^7 +\] +\begin{pccsolution} +The functions $f$, $g$, and $h$ are plotted in \cref{poly:fig:oddpow}. +The domain of each of the functions $f$, $g$, and $h$ is $(-\infty,\infty)$. Note that +the long-run behavior of each of the functions is the same, and in particular +\begin{align*} + f(x)\rightarrow\infty & \text{ as } x\rightarrow\infty \\ + \mathllap{\text{and }} f(x)\rightarrow-\infty & \text{ as } x\rightarrow-\infty +\end{align*} +The same results hold for $g$ and $h$. +\end{pccsolution} +\end{pccexample} + +\begin{figure}[!htb] + \begin{minipage}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-1.5,xmax=1.5, + ymin=-5,ymax=5, + xtick={-1.0,-0.5,...,1.0}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\textwidth, + legend pos=north west, + ] + \addplot expression[domain=-1.5:1.5]{x^3}; + \addplot expression[domain=-1.379:1.379]{x^5}; + \addplot expression[domain=-1.258:1.258]{x^7}; + \addplot[soldot]coordinates{(-1,-1)} node[axisnode,anchor=north west]{$(-1,-1)$}; + \addplot[soldot]coordinates{(1,1)} node[axisnode,anchor=south east]{$(1,1)$}; + \legend{$f$,$g$,$h$} + \end{axis} + \end{tikzpicture} + \caption{Odd power functions} + \label{poly:fig:oddpow} + \end{minipage}% + \hfill + \begin{minipage}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-2.5,xmax=2.5, + ymin=-5,ymax=5, + xtick={-2.0,-1.5,...,2.0}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\textwidth, + legend pos=south east, + ] + \addplot expression[domain=-2.236:2.236]{x^2}; + \addplot expression[domain=-1.495:1.495]{x^4}; + \addplot expression[domain=-1.307:1.307]{x^6}; + \addplot[soldot]coordinates{(-1,1)} node[axisnode,anchor=east]{$(-1,1)$}; + \addplot[soldot]coordinates{(1,1)} node[axisnode,anchor=west]{$(1,1)$}; + \legend{$F$,$G$,$H$} + \end{axis} + \end{tikzpicture} + \caption{Even power functions} + \label{poly:fig:evenpow} + \end{minipage}% +\end{figure} + +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{pccexample}[Power functions with even positive exponents]\label{poly:ex:evenpow}% +Graph each of the following functions, state their domain, and their +long-run behavior as $x\rightarrow\pm\infty$ +\[ + F(x)=x^2, \qquad G(x)=x^4, \qquad H(x)=x^6 +\] +\begin{pccsolution} +The functions $F$, $G$, and $H$ are plotted in \cref{poly:fig:evenpow}. The domain +of each of the functions is $(-\infty,\infty)$. Note that the long-run behavior +of each of the functions is the same, and in particular +\begin{align*} + F(x)\rightarrow\infty & \text{ as } x\rightarrow\infty \\ + \mathllap{\text{and }} F(x)\rightarrow\infty & \text{ as } x\rightarrow-\infty +\end{align*} +The same result holds for $G$ and $H$. +\end{pccsolution} +\end{pccexample} + +\begin{doyouunderstand} + \begin{problem} + Repeat \cref{poly:ex:oddpow,poly:ex:evenpow} using (respectively) + \begin{subproblem} + $f(x)=-x^3, \qquad g(x)=-x^5, \qquad h(x)=-x^7$ + \begin{shortsolution} + The functions $f$, $g$, and $h$ have domain $(-\infty,\infty)$ and + are graphed below. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-1.5,xmax=1.5, + ymin=-5,ymax=5, + xtick={-1.0,-0.5,...,0.5}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\solutionfigurewidth, + legend pos=north east, + ] + \addplot expression[domain=-1.5:1.5]{-x^3}; + \addplot expression[domain=-1.379:1.379]{-x^5}; + \addplot expression[domain=-1.258:1.258]{-x^7}; + \legend{$f$,$g$,$h$} + \end{axis} + \end{tikzpicture} + + Note that + \begin{align*} + f(x)\rightarrow-\infty & \text{ as } x\rightarrow\infty \\ + \mathllap{\text{and }} f(x)\rightarrow\infty & \text{ as } x\rightarrow-\infty + \end{align*} + The same is true for $g$ and $h$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $F(x)=-x^2, \qquad G(x)=-x^4, \qquad H(x)=-x^6$ + \begin{shortsolution} + The functions $F$, $G$, and $H$ have domain $(-\infty,\infty)$ and + are graphed below. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-2.5,xmax=2.5, + ymin=-5,ymax=5, + xtick={-1.0,-0.5,...,0.5}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\solutionfigurewidth, + legend pos=north east, + ] + \addplot expression[domain=-2.236:2.236]{-x^2}; + \addplot expression[domain=-1.495:1.495]{-x^4}; + \addplot expression[domain=-1.307:1.307]{-x^6}; + \legend{$F$,$G$,$H$} + \end{axis} + \end{tikzpicture} + + Note that + \begin{align*} + F(x)\rightarrow-\infty & \text{ as } x\rightarrow\infty \\ + \mathllap{\text{and }} F(x)\rightarrow-\infty & \text{ as } x\rightarrow-\infty + \end{align*} + The same is true for $G$ and $H$. + \end{shortsolution} + \end{subproblem} + \end{problem} +\end{doyouunderstand} + +\subsection*{Polynomial functions} +Now that we have a little more familiarity with power functions, +we can define polynomial functions. Provided that you were comfortable +with our opening discussion about linear and quadratic functions (see +$f$ and $g$ in \cref{poly:eq:linquad}) then there is every chance +that you'll be able to master polynomial functions as well; just remember +that polynomial functions are a natural generalization of linear +and quadratic functions. Once you've studied the examples and problems +in this section, you'll hopefully agree that polynomial functions +are remarkably predictable. + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{pccdefinition}[Polynomial functions] +Polynomial functions have the form +\[ + p(x)=a_nx^n+a_{n-1}x^{n-1}+\ldots+a_1x+a_0 +\] +where $a_n$, $a_{n-1}$, $a_{n-2}$, \ldots, $a_0$ are real numbers. +\begin{itemize} + \item We call $n$ the degree of the polynomial, and require that $n$ + is a non-negative integer; + \item $a_n$, $a_{n-1}$, $a_{n-2}$, \ldots, $a_0$ are called the coefficients; + \item We typically write polynomial functions in descending powers of $x$. +\end{itemize} +In particular, we call $a_n$ the \emph{leading} coefficient, and $a_nx^n$ the +\emph{leading term}. + +Note that if a polynomial is given in factored form, then the degree can be found +by counting the number of linear factors. +\end{pccdefinition} + +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{pccexample}[Polynomial or not] +Identify the following functions as polynomial or not; if the function +is a polynomial, state its degree. +\begin{multicols}{3} + \begin{enumerate} + \item $p(x)=x^2-3$ + \item $q(x)=-4x^{\nicefrac{1}{2}}+10$ + \item $r(x)=10x^5$ + \item $s(x)=x^{-2}+x^{23}$ + \item $f(x)=-8$ + \item $g(x)=3^x$ + \item $h(x)=\sqrt[3]{x^7}-x^2+x$ + \item $k(x)=4x(x+2)(x-3)$ + \item $j(x)=x^2(x-4)(5-x)$ + \end{enumerate} +\end{multicols} +\begin{pccsolution} +\begin{enumerate} + \item $p$ is a polynomial, and its degree is $2$. + \item $q$ is \emph{not} a polynomial, because $\frac{1}{2}$ is not an integer. + \item $r$ is a polynomial, and its degree is $5$. + \item $s$ is \emph{not} a polynomial, because $-2$ is not a positive integer. + \item $f$ is a polynomial, and its degree is $0$. + \item $g$ is \emph{not} a polynomial, because the independent + variable, $x$, is in the exponent. + \item $h$ is \emph{not} a polynomial, because $\frac{7}{3}$ is not an integer. + \item $k$ is a polynomial, and its degree is $3$. + \item $j$ is a polynomial, and its degree is $4$. +\end{enumerate} +\end{pccsolution} +\end{pccexample} + +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{pccexample}[Typical graphs]\label{poly:ex:typical} +\Cref{poly:fig:typical} shows graphs of some polynomial functions; +the ticks have deliberately been left off the axis to allow us to concentrate +on the features of each graph. Note in particular that: +\begin{itemize} + \item \cref{poly:fig:typical1} shows a degree-$1$ polynomial (you might also + classify the function as linear) whose leading coefficient, $a_1$, is positive. + \item \cref{poly:fig:typical2} shows a degree-$2$ polynomial (you might also + classify the function as quadratic) whose leading coefficient, $a_2$, is positive. + \item \cref{poly:fig:typical3} shows a degree-$3$ polynomial whose leading coefficient, $a_3$, + is positive| compare its overall + shape and long-run behavior to the functions described in \cref{poly:ex:oddpow}. + \item \cref{poly:fig:typical4} shows a degree-$4$ polynomial whose leading coefficient, $a_4$, + is positive|compare its overall shape and long-run behavior to the functions described in \cref{poly:ex:evenpow}. + \item \cref{poly:fig:typical5} shows a degree-$5$ polynomial whose leading coefficient, $a_5$, + is positive| compare its overall + shape and long-run behavior to the functions described in \cref{poly:ex:oddpow}. +\end{itemize} +\end{pccexample} + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{figure}[!htb] + \begin{widepage} + \setlength{\figurewidth}{\textwidth/6} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-10:8]{(x+2)}; + \end{axis} + \end{tikzpicture} + \caption{$a_1>0$} + \label{poly:fig:typical1} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-4:4]{(x^2-6)}; + \end{axis} + \end{tikzpicture} + \caption{$a_2>0$} + \label{poly:fig:typical2} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-7.5:7.5]{0.05*(x+6)*x*(x-6)}; + \end{axis} + \end{tikzpicture} + \caption{$a_3>0$} + \label{poly:fig:typical3} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-2.35:5.35,samples=100]{0.2*(x-5)*x*(x-3)*(x+2)}; + \end{axis} + \end{tikzpicture} + \caption{$a_4>0$} + \label{poly:fig:typical4} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-5.5:6.3,samples=100]{0.01*(x+2)*x*(x-3)*(x+5)*(x-6)}; + \end{axis} + \end{tikzpicture} + \caption{$a_5>0$} + \label{poly:fig:typical5} + \end{subfigure} + \end{widepage} + \caption{Graphs to illustrate typical curves of polynomial functions.} + \label{poly:fig:typical} +\end{figure} + +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{doyouunderstand} + \begin{problem} + Use \cref{poly:ex:typical} and \cref{poly:fig:typical} to help you sketch + the graphs of polynomial functions that have negative leading coefficients| note + that there are many ways to do this! The intention with this problem + is to use your knowledge of transformations- in particular, \emph{reflections}- + to guide you. + \begin{shortsolution} + $a_1<0$: + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\solutionfigurewidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-10:8]{-(x+2)}; + \end{axis} + \end{tikzpicture} + + $a_2<0$ + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\solutionfigurewidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-4:4]{-(x^2-6)}; + \end{axis} + \end{tikzpicture} + + $a_3<0$ + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\solutionfigurewidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-7.5:7.5]{-0.05*(x+6)*x*(x-6)}; + \end{axis} + \end{tikzpicture} + + $a_4<0$ + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\solutionfigurewidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-2.35:5.35,samples=100]{-0.2*(x-5)*x*(x-3)*(x+2)}; + \end{axis} + \end{tikzpicture} + + $a_5<0$ + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\solutionfigurewidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-5.5:6.3,samples=100]{-0.01*(x+2)*x*(x-3)*(x+5)*(x-6)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{problem} +\end{doyouunderstand} + +\fixthis{poly: Need a more basic example here- it can have a similar +format to the multiple zeros example, but just keep it simple; it should +be halfway between the 2 examples surrounding it} + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{pccexample}[Multiple zeros] +Consider the polynomial functions $p$, $q$, and $r$ which are +graphed in \cref{poly:fig:moremultiple}. +The formulas for $p$, $q$, and $r$ are as follows +\begin{align*} + p(x) & =(x-3)^2(x+4)^2 \\ + q(x) & =x(x+2)^2(x-1)^2(x-3) \\ + r(x) & =x(x-3)^3(x+1)^2 +\end{align*} +Find the degree of $p$, $q$, and $r$, and decide if the functions bounce off or cut +through the horizontal axis at each of their zeros. +\begin{pccsolution} +The degree of $p$ is 4. Referring to \cref{poly:fig:bouncep}, +the curve bounces off the horizontal axis at both zeros, $3$ and $4$. + +The degree of $q$ is 6. Referring to \cref{poly:fig:bounceq}, +the curve bounces off the horizontal axis at $-2$ and $1$, and cuts +through the horizontal axis at $0$ and $3$. + +The degree of $r$ is 6. Referring to \cref{poly:fig:bouncer}, +the curve bounces off the horizontal axis at $-1$, and cuts through +the horizontal axis at $0$ and at $3$, although is flattened immediately to the left and right of $3$. +\end{pccsolution} +\end{pccexample} + +\setlength{\figurewidth}{0.25\textwidth} +\begin{figure}[!htb] + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-6,xmax=5, + ymin=-30,ymax=200, + xtick={-4,-2,...,4}, + width=\textwidth, + ] + \addplot expression[domain=-5.63733:4.63733,samples=50]{(x-3)^2*(x+4)^2}; + \addplot[soldot]coordinates{(3,0)(-4,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=p(x)$} + \label{poly:fig:bouncep} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-3,xmax=4, + xtick={-2,...,3}, + ymin=-60,ymax=40, + width=\textwidth, + ] + \addplot+[samples=50] expression[domain=-2.49011:3.11054]{x*(x+2)^2*(x-1)^2*(x-3)}; + \addplot[soldot]coordinates{(-2,0)(0,0)(1,0)(3,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=q(x)$} + \label{poly:fig:bounceq} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-2,xmax=4, + xtick={-1,...,3}, + ymin=-40,ymax=40, + width=\textwidth, + ] + \addplot expression[domain=-1.53024:3.77464,samples=50]{x*(x-3)^3*(x+1)^2}; + \addplot[soldot]coordinates{(-1,0)(0,0)(3,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=r(x)$} + \label{poly:fig:bouncer} + \end{subfigure} + \caption{} + \label{poly:fig:moremultiple} +\end{figure} + +\begin{pccdefinition}[Multiple zeros]\label{poly:def:multzero} +Let $p$ be a polynomial that has a repeated linear factor $(x-a)^n$. Then we say +that $p$ has a multiple zero at $a$ of multiplicity $n$ and +\begin{itemize} + \item if the factor $(x-a)$ is repeated an even number of times, the graph of $y=p(x)$ does not + cross the $x$ axis at $a$, but `bounces' off the horizontal axis at $a$. + \item if the factor $(x-a)$ is repeated an odd number of times, the graph of $y=p(x)$ crosses the + horizontal axis at $a$, but it looks `flattened' there +\end{itemize} +If $n=1$, then we say that $p$ has a \emph{simple} zero at $a$. +\end{pccdefinition} + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{pccexample}[Find a formula] +Find formulas for the polynomial functions, $p$ and $q$, graphed in \cref{poly:fig:findformulademoboth}. +\begin{figure}[!htb] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[framed, + xmin=-5,xmax=5, + ymin=-10,ymax=10, + xtick={-4,-2,...,4}, + minor xtick={-3,-1,...,3}, + ytick={-8,-6,...,8}, + width=\textwidth, + grid=both] + \addplot expression[domain=-3.25842:2.25842,samples=50]{-x*(x-2)*(x+3)*(x+1)}; + \addplot[soldot]coordinates{(1,8)}node[axisnode,inner sep=.35cm,anchor=west]{$(1,8)$}; + \addplot[soldot]coordinates{(-3,0)(-1,0)(0,0)(2,0)}; + \end{axis} + \end{tikzpicture} + \caption{$p$} + \label{poly:fig:findformulademo} + \end{subfigure} + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[framed, + xmin=-5,xmax=5, + ymin=-10,ymax=10, + xtick={-4,-2,...,4}, + minor xtick={-3,-1,...,3}, + ytick={-8,-6,...,8}, + width=\textwidth, + grid=both] + \addplot expression[domain=-4.33:4.08152]{-.25*(x+2)^2*(x-3)}; + \addplot[soldot]coordinates{(2,4)}node[axisnode,anchor=south west]{$(2,4)$}; + \addplot[soldot]coordinates{(-2,0)(3,0)}; + \end{axis} + \end{tikzpicture} + \caption{$q$} + \label{poly:fig:findformulademo1} + \end{subfigure} + \caption{} + \label{poly:fig:findformulademoboth} +\end{figure} +\begin{pccsolution} +\begin{enumerate} + \item We begin by noting that the horizontal intercepts of $p$ are $(-3,0)$, $(-1,0)$, $(0,0)$ and $(2,0)$. + We also note that each zero is simple (multiplicity $1$). + If we assume that $p$ has no other zeros, then we can start by writing + \begin{align*} + p(x) & =(x+3)(x+1)(x-0)(x-2) \\ + & =x(x+3)(x+1)(x-2) \\ + \end{align*} + According to \cref{poly:fig:findformulademo}, the point $(1,8)$ lies + on the curve $y=p(x)$. + Let's check if the formula we have written satisfies this requirement + \begin{align*} + p(1) & = (1)(4)(2)(-1) \\ + & = -8 + \end{align*} + which is clearly not correct| it is close though. We can correct this by + multiplying $p$ by a constant $k$; so let's assume that + \[ + p(x)=kx(x+3)(x+1)(x-2) + \] + Then $p(1)=-8k$, and if this is to equal $8$, then $k=-1$. Therefore + the formula for $p(x)$ is + \[ + p(x)=-x(x+3)(x+1)(x-2) + \] + \item The function $q$ has a zero at $-2$ of multiplicity $2$, and zero of + multiplicity $1$ at $3$ (so $3$ is a simple zero of $q$); we can therefore assume that $q$ has the form + \[ + q(x)=k(x+2)^2(x-3) + \] + where $k$ is some real number. In order to find $k$, we use the given ordered pair, $(2,4)$, and + evaluate $p(2)$ + \begin{align*} + p(2) & =k(4)^2(-1) \\ + & =-16k + \end{align*} + We solve the equation $4=-8k$ and obtain $k=-\frac{1}{4}$ and conclude that the + formula for $q(x)$ is + \[ + q(x)=-\frac{1}{4}(x+2)^2(x-3) + \] +\end{enumerate} +\end{pccsolution} +\end{pccexample} + + +\fixthis{Chris: need sketching polynomial problems} +\begin{pccspecialcomment}[Steps to follow when sketching polynomial functions] + \begin{steps} + \item \label{poly:step:first} Determine the degree of the polynomial, + its leading term and leading coefficient, and hence determine + the long-run behavior of the polynomial| does it behave like $\pm x^2$ or $\pm x^3$ + as $x\rightarrow\pm\infty$? + \item Determine the zeros and their multiplicity. Mark all zeros + and the vertical intercept on the graph using solid circles $\bullet$. + \item \label{poly:step:last} Deduce the overall shape of the curve, and sketch it. If there isn't + enough information from the previous steps, then construct a table of values. + \end{steps} + Remember that until we have the tools of calculus, we won't be able to + find the exact coordinates of local minimums, local maximums, and points + of inflection. +\end{pccspecialcomment} +Before we demonstrate some examples, it is important to remember the following: +\begin{itemize} + \item our sketches will give a good representation of the overall + shape of the graph, but until we have the tools of calculus (from MTH 251) + we can not find local minimums, local maximums, and inflection points algebraically. This + means that we will make our best guess as to where these points are. + \item we will not concern ourselves too much with the vertical scale (because of + our previous point)| we will, however, mark the vertical intercept (assuming there is one), + and any horizontal asymptotes. +\end{itemize} +%=================================== +% Author: Hughes +% Date: May 2012 +%=================================== +\begin{pccexample}\label{poly:ex:simplecubic} +Use \crefrange{poly:step:first}{poly:step:last} to sketch a graph of the function $p$ +that has formula +\[ + p(x)=\frac{1}{2}(x-4)(x-1)(x+3) +\] +\begin{pccsolution} +\begin{steps} + \item $p$ has degree $3$. The leading term of $p$ is $\frac{1}{2}x^3$, so the leading coefficient of $p$ + is $\frac{1}{2}$. The long-run behavior of $p$ is therefore similar to that of $x^3$. + \item The zeros of $p$ are $-3$, $1$, and $4$; each zero is simple (i.e, it has multiplicity $1$). + This means that the curve of $p$ cuts the horizontal axis at each zero. The vertical + intercept of $p$ is $(0,6)$. + \item We draw the details we have obtained so far on \cref{poly:fig:simplecubicp1}. Given + that the curve of $p$ looks like the curve of $x^3$ in the long-run, we are able to complete a sketch of the + graph of $p$ in \cref{poly:fig:simplecubicp2}. + + Note that we can not find the coordinates of the local minimums, local maximums, and inflection + points| for the moment we make reasonable guesses as to where these points are (you'll find how + to do this in calculus). +\end{steps} + +\begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=15, + xtick={-8,-6,...,8}, + ytick={-5,5}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-3,0)(1,0)(4,0)(0,6)}node[axisnode,anchor=south west]{$(0,6)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:simplecubicp1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=15, + xtick={-8,-6,...,8}, + ytick={-5,5}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-3,0)(1,0)(4,0)(0,6)}node[axisnode,anchor=south west]{$(0,6)$}; + \addplot[pccplot] expression[domain=-3.57675:4.95392,samples=100]{.5*(x-4)*(x-1)*(x+3)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:simplecubicp2} + \end{subfigure}% + \caption{$y=\dfrac{1}{2}(x-4)(x-1)(x+3)$} + \label{poly:fig:simplecubic} +\end{figure} +\end{pccsolution} +\end{pccexample} + +%=================================== +% Author: Hughes +% Date: May 2012 +%=================================== +\begin{pccexample}\label{poly:ex:degree5} +Use \crefrange{poly:step:first}{poly:step:last} to sketch a graph of the function $q$ +that has formula +\[ + q(x)=\frac{1}{200}(x+7)^2(2-x)(x-6)^2 +\] +\begin{pccsolution} +\begin{steps} + \item $q$ has degree $4$. The leading term of $q$ is + \[ + -\frac{1}{200}x^5 + \] + so the leading coefficient of $q$ is $-\frac{1}{200}$. The long-run behavior of $q$ + is therefore similar to that of $-x^5$. + \item The zeros of $q$ are $-7$ (multiplicity 2), $2$ (simple), and $6$ (multiplicity $2$). + The curve of $q$ bounces off the horizontal axis at the zeros with multiplicity $2$ and + cuts the horizontal axis at the simple zeros. The vertical intercept of $q$ is $\left( 0,\frac{441}{25} \right)$. + \item We mark the details we have found so far on \cref{poly:fig:degree5p1}. Given that + the curve of $q$ looks like the curve of $-x^5$ in the long-run, we can complete \cref{poly:fig:degree5p2}. +\end{steps} + +\begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=40, + xtick={-8,-6,...,8}, + ytick={-5,0,...,35}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-7,0)(2,0)(6,0)(0,441/25)}node[axisnode,anchor=south west]{$\left( 0, \frac{441}{25} \right)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:degree5p1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=40, + xtick={-8,-6,...,8}, + ytick={-5,0,...,35}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-7,0)(2,0)(6,0)(0,441/25)}node[axisnode,anchor=south west]{$\left( 0, \frac{441}{25} \right)$}; + \addplot[pccplot] expression[domain=-8.83223:7.34784,samples=50]{1/200*(x+7)^2*(2-x)*(x-6)^2}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:degree5p2} + \end{subfigure}% + \caption{$y=\dfrac{1}{200}(x+7)^2(2-x)(x-6)^2$} + \label{poly:fig:degree5} +\end{figure} +\end{pccsolution} +\end{pccexample} + +%=================================== +% Author: Hughes +% Date: May 2012 +%=================================== +\begin{pccexample} +Use \crefrange{poly:step:first}{poly:step:last} to sketch a graph of the function $r$ +that has formula +\[ + r(x)=\frac{1}{100}x^3(x+4)(x-4)(x-6) +\] +\begin{pccsolution} +\begin{steps} + \item $r$ has degree $6$. The leading term of $r$ is + \[ + \frac{1}{100}x^6 + \] + so the leading coefficient of $r$ is $\frac{1}{100}$. The long-run behavior of $r$ + is therefore similar to that of $x^6$. + \item The zeros of $r$ are $-4$ (simple), $0$ (multiplicity $3$), $4$ (simple), + and $6$ (simple). The vertical intercept of $r$ is $(0,0)$. The curve of $r$ + cuts the horizontal axis at the simple zeros, and goes through the axis + at $(0,0)$, but does so in a flattened way. + \item We mark the zeros and vertical intercept on \cref{poly:fig:degree6p1}. Given that + the curve of $r$ looks like the curve of $x^6$ in the long-run, we complete the graph + of $r$ in \cref{poly:fig:degree6p2}. +\end{steps} + +\begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=10, + ymin=-20,ymax=10, + xtick={-4,-2,...,8}, + ytick={-15,-10,...,5}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-4,0)(0,0)(4,0)(6,0)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:degree6p1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=10, + ymin=-20,ymax=10, + xtick={-4,-2,...,8}, + ytick={-15,-10,...,5}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-4,0)(0,0)(4,0)(6,0)}; + \addplot[pccplot] expression[domain=-4.16652:6.18911,samples=100]{1/100*(x+4)*x^3*(x-4)*(x-6)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:degree6p2} + \end{subfigure}% + \caption{$y=\dfrac{1}{100}(x+4)x^3(x-4)(x-6)$} +\end{figure} +\end{pccsolution} +\end{pccexample} + +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{pccexample}[An open-topped box] +A cardboard company makes open-topped boxes for their clients. The specifications +dictate that the box must have a square base, and that it must be open-topped. +The company uses sheets of cardboard that are $\unit[1200]{cm^2}$. Assuming that +the base of each box has side $x$ (measured in cm), it can be shown that the volume of each box, $V(x)$, +has formula +\[ + V(x)=\frac{x}{4}(1200-x^2) +\] +Find the dimensions of the box that maximize the volume. +\begin{pccsolution} +We graph $y=V(x)$ in \cref{poly:fig:opentoppedbox}. Note that because +$x$ represents the length of a side, and $V(x)$ represents the volume +of the box, we necessarily require both values to be positive; we illustrate +the part of the curve that applies to this problem using a solid line. + +\begin{figure}[!htb] + \centering + \begin{tikzpicture} + \begin{axis}[framed, + xmin=-50,xmax=50, + ymin=-5000,ymax=5000, + xtick={-40,-30,...,40}, + minor xtick={-45,-35,...,45}, + minor ytick={-3000,-1000,1000,3000}, + width=.75\textwidth, + height=.5\textwidth, + grid=both] + \addplot[pccplot,dashed,<-] expression[domain=-40:0,samples=50]{x/4*(1200-x^2)}; + \addplot[pccplot,-] expression[domain=0:34.64,samples=50]{x/4*(1200-x^2)}; + \addplot[pccplot,dashed,->] expression[domain=34.64:40,samples=50]{x/4*(1200-x^2)}; + \addplot[soldot] coordinates{(20,4000)}; + \end{axis} + \end{tikzpicture} + \caption{$y=V(x)$} + \label{poly:fig:opentoppedbox} +\end{figure} + +According to \cref{poly:fig:opentoppedbox}, the maximum volume of such a box is +approximately $\unit[4000]{cm^2}$, and we achieve it using a base of length +approximately $\unit[20]{cm}$. Since the base is square and each sheet of cardboard +is $\unit[1200]{cm^2}$, we conclude that the dimensions of each box are $\unit[20]{cm}\times\unit[20]{cm}\times\unit[30]{cm}$. +\end{pccsolution} +\end{pccexample} + +\subsection*{Complex zeros} +There has been a pattern to all of the examples that we have seen so far| +the degree of the polynomial has dictated the number of \emph{real} zeros that the +polynomial has. For example, the function $p$ in \cref{poly:ex:simplecubic} +has degree $3$, and $p$ has $3$ real zeros; the function $q$ in \cref{poly:ex:degree5} +has degree $5$ and $q$ has $5$ real zeros. + +You may wonder if this result can be generalized| does every polynomial that +has degree $n$ have $n$ real zeros? Before we tackle the general result, +let's consider an example that may help motivate it. +%=================================== +% Author: Hughes +% Date: June 2012 +%=================================== +\begin{pccexample}\label{poly:ex:complx} +Consider the polynomial function $c$ that has formula +\[ + c(x)=x(x^2+1) +\] +It is clear that $c$ has degree $3$, and that $c$ has a (simple) zero at $0$. Does +$c$ have any other zeros, i.e, can we find any values of $x$ that satisfy the equation +\begin{equation}\label{poly:eq:complx} + x^2+1=0 +\end{equation} +The solutions to \cref{poly:eq:complx} are $\pm i$. + +We conclude that $c$ has $3$ zeros: $0$ and $\pm i$; we note that \emph{not +all of them are real}. +\end{pccexample} +\Cref{poly:ex:complx} shows that not every degree-$3$ polynomial has $3$ +\emph{real} zeros; however, if we are prepared to venture into the complex numbers, +then we can state the following theorem. +%=================================== +% Author: Hughes +% Date: June 2012 +%=================================== +\begin{pccspecialcomment}[The fundamental theorem of algebra] + Every polynomial function of degree $n$ has $n$ roots, some of which may + be complex, and some may be repeated. +\end{pccspecialcomment} +\fixthis{Fundamental theorem of algebra: is this wording ok? do we want +it as a theorem?} +%=================================== +% Author: Hughes +% Date: June 2012 +%=================================== +\begin{pccexample} +Find all the zeros of the polynomial function $p$ that has formula +\[ + p(x)=x^4-2x^3+5x^2 +\] +\begin{pccsolution} +We begin by factoring $p$ +\begin{align*} + p(x) & =x^4-2x^3+5x^2 \\ + & =x^2(x^2-2x+5) +\end{align*} +We note that $0$ is a zero of $p$ with multiplicity $2$. The other zeros of $p$ +can be found by solving the equation +\[ + x^2-2x+5=0 +\] +This equation can not be factored, so we use the quadratic formula +\begin{align*} + x & =\frac{2\pm\sqrt{(-2)^2}-20}{2(1)} \\ + & =\frac{2\pm\sqrt{-16}}{2} \\ + & =1\pm 2i +\end{align*} +We conclude that $p$ has $4$ zeros: $0$ (multiplicity $2$), and $1\pm 2i$ (simple). +\end{pccsolution} +\end{pccexample} +%=================================== +% Author: Hughes +% Date: June 2012 +%=================================== +\begin{pccexample} +Find a polynomial that has zeros at $2\pm i\sqrt{2}$. +\begin{pccsolution} +We know that the zeros of a polynomial can be found by analyzing the linear +factors. We are given the zeros, and have to work backwards to find the +linear factors. + +We begin by assuming that $p$ has the form +\begin{align*} + p(x) & =(x-(2-i\sqrt{2}))(x-(2+i\sqrt{2})) \\ + & =x^2-x(2+i\sqrt{2})-x(2-i\sqrt{2})+(2-i\sqrt{2})(2+i\sqrt{2}) \\ + & =x^2-4x+(4-2i^2) \\ + & =x^2-4x+6 +\end{align*} +We conclude that a possible formula for a polynomial function, $p$, +that has zeros at $2\pm i\sqrt{2}$ is +\[ + p(x)=x^2-4x+6 +\] +Note that we could multiply $p$ by any real number and still ensure +that $p$ has the same zeros. +\end{pccsolution} +\end{pccexample} +\investigation*{} +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{problem}[Find a formula from a graph] +For each of the polynomials in \cref{poly:fig:findformula} +\begin{enumerate} + \item count the number of times the curve turns round, and cuts/bounces off the $x$ axis; + \item approximate the degree of the polynomial; + \item use your information to find the linear factors of each polynomial, and therefore write a possible formula for each; + \item make sure your polynomial goes through the given ordered pair. +\end{enumerate} +\begin{shortsolution} + \Vref{poly:fig:findformdeg2}: + \begin{enumerate} + \item the curve turns round once; + \item the degree could be 2; + \item based on the zeros, the linear factors are $(x+5)$ and $(x-3)$; since the + graph opens downwards, we will assume the leading coefficient is negative: $p(x)=-k(x+5)(x-3)$; + \item $p$ goes through $(2,2)$, so we need to solve $2=-k(7)(-1)$ and therefore $k=\nicefrac{2}{7}$, so + \[ + p(x)=-\frac{2}{7}(x+5)(x-3) + \] + \end{enumerate} + \Vref{poly:fig:findformdeg3}: + \begin{enumerate} + \item the curve turns around twice; + \item the degree could be 3; + \item based on the zeros, the linear factors are $(x+2)^2$, and $(x-1)$; + based on the behavior of $p$, we assume that the leading coefficient is positive, and try $p(x)=k(x+2)^2(x-1)$; + \item $p$ goes through $(0,-2)$, so we need to solve $-2=k(4)(-1)$ and therefore $k=\nicefrac{1}{2}$, so + \[ + p(x)=\frac{1}{2}(x+2)^2(x-1) + \] + \end{enumerate} + \Vref{poly:fig:findformdeg5}: + \begin{enumerate} + \item the curve turns around 4 times; + \item the degree could be 5; + \item based on the zeros, the linear factors are $(x+5)^2$, $(x+1)$, $(x-2)$, $(x-3)$; + based on the behavior of $p$, we assume that the leading coefficient is positive, and try $p(x)=k(x+5)^2(x+1)(x-2)(x-3)$; + \item $p$ goes through $(-3,-50)$, so we need to solve $-50=k(64)(-2)(-5)(-6)$ and therefore $k=\nicefrac{5}{384}$, so + \[ + p(x)=\frac{5}{384}(x+5)^2(x+1)(x-2)(x-3) + \] + \end{enumerate} +\end{shortsolution} +\end{problem} + + +\begin{figure}[!htb] + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-2,ymax=5, + width=\textwidth, + ] + \addplot expression[domain=-4.5:3.75]{-1/3*(x+4)*(x-3)}; + \addplot[soldot] coordinates{(-4,0)(3,0)(2,2)} node[axisnode,above right]{$(2,2)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:findformdeg2} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-3,xmax=2, + ymin=-2,ymax=4, + xtick={-2,...,1}, + width=\textwidth, + ] + \addplot expression[domain=-2.95:1.75]{1/3*(x+2)^2*(x-1)}; + \addplot[soldot]coordinates{(-2,0)(1,0)(0,-1.33)}node[axisnode,anchor=north west]{$(0,-2)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:findformdeg3} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-100,ymax=150, + width=\textwidth, + ] + \addplot expression[domain=-4.5:3.4,samples=50]{(x+4)^2*(x+1)*(x-2)*(x-3)}; + \addplot[soldot]coordinates{(-4,0)(-1,0)(2,0)(3,0)(-3,-60)}node[axisnode,anchor=north]{$(-3,-50)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:findformdeg5} + \end{subfigure} + \caption{} + \label{poly:fig:findformula} +\end{figure} + + + + +\begin{exercises} +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{problem}[Prerequisite classifacation skills] +Decide if each of the following functions are linear or quadratic. +\begin{multicols}{3} + \begin{subproblem} + $f(x)=2x+3$ + \begin{shortsolution} + $f$ is linear. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $g(x)=10-7x$ + \begin{shortsolution} + $g$ is linear + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $h(x)=-x^2+3x-9$ + \begin{shortsolution} + $h$ is quadratic. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $k(x)=-17$ + \begin{shortsolution} + $k$ is linear. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $l(x)=-82x^2-4$ + \begin{shortsolution} + $l$ is quadratic + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $m(x)=6^2x-8$ + \begin{shortsolution} + $m$ is linear. + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{problem}[Prerequisite slope identification] +State the slope of each of the following linear functions, and +hence decide if each function is increasing or decreasing. +\begin{multicols}{4} + \begin{subproblem} + $\alpha(x)=4x+1$ + \begin{shortsolution} + $m=4$; $\alpha$ is increasing. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $\beta(x)=-9x$ + \begin{shortsolution} + $m=-9$; $\beta$ is decreasing. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $\gamma(t)=18t+100$ + \begin{shortsolution} + $m=18$; $\gamma$ is increasing. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $\delta(y)=23-y$ + \begin{shortsolution} + $m=-1$; $\delta$ is decreasing. + \end{shortsolution} + \end{subproblem} +\end{multicols} +Now let's generalize our findings for the most general linear function $f$ +that has formula $f(x)=mx+b$. Complete the following sentences. +\begin{subproblem} + When $m>0$, the function $f$ is $\ldots$ + \begin{shortsolution} + When $m>0$, the function $f$ is $\ldots$ \emph{increasing}. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + When $m<0$, the function $f$ is $\ldots$ + \begin{shortsolution} + When $m<0$, the function $f$ is $\ldots$ \emph{decreasing}. + \end{shortsolution} +\end{subproblem} +\end{problem} +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{problem}[Polynomial or not?] +Identify whether each of the following functions is a polynomial or not. +If the function is a polynomial, state its degree. +\begin{multicols}{3} + \begin{subproblem} + $p(x)=2x+1$ + \begin{shortsolution} + $p$ is a polynomial (you might also describe $p$ as linear). The degree of $p$ is 1. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=7x^2+4x$ + \begin{shortsolution} + $p$ is a polynomial (you might also describe $p$ as quadratic). The degree of $p$ is 2. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=\sqrt{x}+2x+1$ + \begin{shortsolution} + $p$ is not a polynomial; we require the powers of $x$ to be integer values. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=2^x-45$ + \begin{shortsolution} + $p$ is not a polynomial; the $2^x$ term is exponential. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=6x^4-5x^3+9$ + \begin{shortsolution} + $p$ is a polynomial, and the degree of $p$ is $6$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=-5x^{17}+9x+2$ + \begin{shortsolution} + $p$ is a polynomial, and the degree of $p$ is 17. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=4x(x+7)^2(x-3)^3$ + \begin{shortsolution} + $p$ is a polynomial, and the degree of $p$ is $6$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=4x^{-5}-x^2+x$ + \begin{shortsolution} + $p$ is not a polynomial because $-5$ is not a positive integer. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=-x^6(x^2+1)(x^3-2)$ + \begin{shortsolution} + $p$ is a polynomial, and the degree of $p$ is $11$. + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{problem}[Polynomial graphs] +Three polynomial functions $p$, $m$, and $n$ are shown in \crefrange{poly:fig:functionp}{poly:fig:functionn}. +The functions have the following formulas +\begin{align*} + p(x) & = (x-1)(x+2)(x-3) \\ + m(x) & = -(x-1)(x+2)(x-3) \\ + n(x) & = (x-1)(x+2)(x-3)(x+1)(x+4) +\end{align*} +Note that for our present purposes we are not concerned with the vertical scale of the graphs. +\begin{subproblem} + Identify both on the graph {\em and} algebraically, the zeros of each polynomial. + \begin{shortsolution} + $y=p(x)$ is shown below. + + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-10,ymax=10, + width=\solutionfigurewidth, + ] + \addplot expression[domain=-2.5:3.5,samples=50]{(x-1)*(x+2)*(x-3)}; + \addplot[soldot] coordinates{(-2,0)(1,0)(3,0)}; + \end{axis} + \end{tikzpicture} + + $y=m(x)$ is shown below. + + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-10,ymax=10, + width=\solutionfigurewidth, + ] + \addplot expression[domain=-2.5:3.5,samples=50]{-1*(x-1)*(x+2)*(x-3)}; + \addplot[soldot] coordinates{(-2,0)(1,0)(3,0)}; + \end{axis} + \end{tikzpicture} + + $y=n(x)$ is shown below. + + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-90,ymax=70, + width=\solutionfigurewidth, + ] + \addplot expression[domain=-4.15:3.15,samples=50]{(x-1)*(x+2)*(x-3)*(x+1)*(x+4)}; + \addplot[soldot] coordinates{(-4,0)(-2,0)(-1,0)(1,0)(3,0)}; + \end{axis} + \end{tikzpicture} + + The zeros of $p$ are $-2$, $1$, and $3$; the zeros of $m$ are $-2$, $1$, and $3$; the zeros of $n$ are + $-4$, $-2$, $-1$, and $3$. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Write down the degree, how many times the curve of each function `turns around', + and how many zeros it has + \begin{shortsolution} + \begin{itemize} + \item The degree of $p$ is 3, and the curve $y=p(x)$ turns around twice. + \item The degree of $q$ is also 3, and the curve $y=q(x)$ turns around twice. + \item The degree of $n$ is $5$, and the curve $y=n(x)$ turns around 4 times. + \end{itemize} + \end{shortsolution} +\end{subproblem} +\end{problem} + +\begin{figure}[!htb] + \begin{widepage} + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-10,ymax=10, + ytick={-5,5}, + width=\textwidth, + ] + \addplot expression[domain=-2.5:3.5,samples=50]{(x-1)*(x+2)*(x-3)}; + \addplot[soldot]coordinates{(-2,0)(1,0)(3,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=p(x)$} + \label{poly:fig:functionp} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-10,ymax=10, + ytick={-5,5}, + width=\textwidth, + ] + \addplot expression[domain=-2.5:3.5,samples=50]{-1*(x-1)*(x+2)*(x-3)}; + \addplot[soldot]coordinates{(-2,0)(1,0)(3,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=m(x)$} + \label{poly:fig:functionm} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-90,ymax=70, + width=\textwidth, + ] + \addplot expression[domain=-4.15:3.15,samples=100]{(x-1)*(x+2)*(x-3)*(x+1)*(x+4)}; + \addplot[soldot]coordinates{(-4,0)(-2,0)(-1,0)(1,0)(3,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=n(x)$} + \label{poly:fig:functionn} + \end{subfigure} + \caption{} + \end{widepage} +\end{figure} +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{problem}[Horizontal intercepts]\label{poly:prob:matchpolys}% +State the horizontal intercepts (as ordered pairs) of the following polynomials. +\begin{multicols}{2} + \begin{subproblem}\label{poly:prob:degree5} + $p(x)=(x-1)(x+2)(x-3)(x+1)(x+4)$ + \begin{shortsolution} + $(-4,0)$, $(-2,0)$, $(-1,0)$, $(1,0)$, $(3,0)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $q(x)=-(x-1)(x+2)(x-3)$ + \begin{shortsolution} + $(-2,0)$, $(1,0)$, $(3,0)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $r(x)=(x-1)(x+2)(x-3)$ + \begin{shortsolution} + $(-2,0)$, $(1,0)$, $(3,0)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem}\label{poly:prob:degree2} + $s(x)=(x-2)(x+2)$ + \begin{shortsolution} + $(-2,0)$, $(2,0)$ + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{problem}[Minimums, maximums, and concavity]\label{poly:prob:incdec} +Four polynomial functions are graphed in \cref{poly:fig:incdec}. The formulas +for these functions are (not respectively) +\begin{gather*} + p(x)=\frac{x^3}{6}-\frac{x^2}{4}-3x, \qquad q(x)=\frac{x^4}{20}+\frac{x^3}{15}-\frac{6}{5}x^2+1\\ + r(x)=-\frac{x^5}{50}-\frac{x^4}{40}+\frac{2x^3}{5}+6, \qquad s(x)=-\frac{x^6}{6000}-\frac{x^5}{2500}+\frac{67x^4}{4000}+\frac{17x^3}{750}-\frac{42x^2}{125} +\end{gather*} +\begin{figure}[!htb] + \begin{widepage} + \setlength{\figurewidth}{.23\textwidth} + \centering + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + width=\textwidth, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-8,-6,...,8}, + grid=major, + ] + \addplot expression[domain=-5.28:4.68,samples=50]{-x^5/50-x^4/40+2*x^3/5+6}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:incdec3} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + width=\textwidth, + xmin=-10,xmax=10,ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-8,-6,...,8}, + grid=major, + ] + \addplot expression[domain=-6.08:4.967,samples=50]{x^4/20+x^3/15-6/5*x^2+1}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:incdec2} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + width=\textwidth, + xmin=-6,xmax=8,ymin=-10,ymax=10, + xtick={-4,-2,...,6}, + ytick={-8,-4,4,8}, + minor ytick={-6,-2,...,6}, + grid=both, + ] + \addplot expression[domain=-4.818:6.081,samples=50]{x^3/6-x^2/4-3*x}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:incdec1} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + width=\textwidth, + xmin=-10,xmax=10,ymin=-10,ymax=10, + xtick={-8,-4,4,8}, + ytick={-8,-4,4,8}, + minor xtick={-6,-2,...,6}, + minor ytick={-6,-2,...,6}, + grid=both, + ] + \addplot expression[domain=-9.77:8.866,samples=50]{-x^6/6000-x^5/2500+67*x^4/4000+17/750*x^3-42/125*x^2}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:incdec4} + \end{subfigure} + \caption{Graphs for \cref{poly:prob:incdec}.} + \label{poly:fig:incdec} + \end{widepage} +\end{figure} +\begin{subproblem} + Match each of the formulas with one of the given graphs. + \begin{shortsolution} + \begin{itemize} + \item $p$ is graphed in \vref{poly:fig:incdec1}; + \item $q$ is graphed in \vref{poly:fig:incdec2}; + \item $r$ is graphed in \vref{poly:fig:incdec3}; + \item $s$ is graphed in \vref{poly:fig:incdec4}. + \end{itemize} + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Approximate the zeros of each function using the appropriate graph. + \begin{shortsolution} + \begin{itemize} + \item $p$ has simple zeros at about $-3.8$, $0$, and $5$. + \item $q$ has simple zeros at about $-5.9$, $-1$, $1$, and $4$. + \item $r$ has simple zeros at about $-5$, $-2.9$, and $4.1$. + \item $s$ has simple zeros at about $-9$, $-6$, $4.2$, $8.1$, and a zero of multiplicity $2$ at $0$. + \end{itemize} + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Approximate the local maximums and minimums of each of the functions. + \begin{shortsolution} + \begin{itemize} + \item $p$ has a local maximum of approximately $3.9$ at $-2$, and a local minimum of approximately $-6.5$ at $3$. + \item $q$ has a local minimum of approximately $-10$ at $-4$, and $-4$ at $3$; $q$ has a local maximum of approximately $1$ at $0$. + \item $r$ has a local minimum of approximately $-5.5$ at $-4$, and a local maximum of approximately $10$ at $3$. + \item $s$ has a local maximum of approximately $5$ at $-8$, $0$ at $0$, and $5$ at $7$; $s$ has local minimums + of approximately $-3$ at $-4$, and $-1$ at $3$. + \end{itemize} + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Approximate the global maximums and minimums of each of the functions. + \begin{shortsolution} + \begin{itemize} + \item $p$ does not have a global maximum, nor a global minimum. + \item $q$ has a global minimum of approximately $-10$; it does not have a global maximum. + \item $r$ does not have a global maximum, nor a global minimum. + \item $s$ has a global maximum of approximately $5$; it does not have a global minimum. + \end{itemize} + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Approximate the intervals on which each function is increasing and decreasing. + \begin{shortsolution} + \begin{itemize} + \item $p$ is increasing on $(-\infty,-2)\cup (3,\infty)$, and decreasing on $(-2,3)$. + \item $q$ is increasing on $(-4,0)\cup (3,\infty)$, and decreasing on $(-\infty,-4)\cup (0,3)$. + \item $r$ is increasing on $(-4,3)$, and decreasing on $(-\infty,-4)\cup (3,\infty)$. + \item $s$ is increasing on $(-\infty,-8)\cup (-4,0)\cup (3,5)$, and decreasing on $(-8,-4)\cup (0,3)\cup (5,\infty)$. + \end{itemize} + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Approximate the intervals on which each function is concave up and concave down. + \begin{shortsolution} + \begin{itemize} + \item $p$ is concave up on $(1,\infty)$, and concave down on $(-\infty,1)$. + \item $q$ is concave up on $(-\infty,-1)\cup (1,\infty)$, and concave down on $(-1,1)$. + \item $r$ is concave up on $(-\infty,-3)\cup (0,2)$, and concave down on $(-3,0)\cup (2,\infty)$. + \item $s$ is concave up on $(-6,-2)\cup (2,5)$, and concave down on $(-\infty,-6)\cup (-2,2)\cup (5,\infty)$. + \end{itemize} + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + The degree of $q$ is $5$. Assuming that all of the real zeros of $q$ are + shown in its graph, how many complex zeros does $q$ have? + \begin{shortsolution} + \Vref{poly:fig:incdec2} shows that $q$ has $3$ real zeros + since the curve of $q$ cuts the horizontal axis $3$ times. + Since $q$ has degree $5$, $q$ must have $2$ complex zeros. + \end{shortsolution} +\end{subproblem} +\end{problem} + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{problem}[Long-run behaviour of polynomials] +Describe the long-run behavior of each of polynomial functions in +\crefrange{poly:prob:degree5}{poly:prob:degree2}. +\begin{shortsolution} + $\dd\lim_{x\rightarrow-\infty}p(x)=-\infty$, + $\dd\lim_{x\rightarrow\infty}p(x)=\infty$, + $\dd\lim_{x\rightarrow-\infty}q(x)=\infty$, + $\dd\lim_{x\rightarrow\infty}q(x)=-\infty$, + $\dd\lim_{x\rightarrow-\infty}r(x)=-\infty$, + $\dd\lim_{x\rightarrow\infty}r(x)=\infty$, + $\dd\lim_{x\rightarrow-\infty}s(x)=\infty$, + $\dd\lim_{x\rightarrow\infty}s(x)=\infty$, +\end{shortsolution} +\end{problem} + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{problem}[True of false?] +Let $p$ be a polynomial function. +Label each of the following statements as true (T) or false (F); if they are false, +provide an example that supports your answer. +\begin{subproblem} + If $p$ has degree $3$, then $p$ has $3$ distinct zeros. + \begin{shortsolution} + False. Consider $p(x)=x^2(x+1)$ which has only 2 distinct zeros. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + If $p$ has degree $4$, then $\dd\lim_{x\rightarrow-\infty}p(x)=\infty$ and $\dd\lim_{x\rightarrow\infty}p(x)=\infty$. + \begin{shortsolution} + False. Consider $p(x)=-x^4$. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + If $p$ has even degree, then it is possible that $p$ can have no real zeros. + \begin{shortsolution} + True. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + If $p$ has odd degree, then it is possible that $p$ can have no real zeros. + \begin{shortsolution} + False. All odd degree polynomials will cut the horizontal axis at least once. + \end{shortsolution} +\end{subproblem} +\end{problem} +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{problem}[Find a formula from a description] +In each of the following problems, give a possible formula for a polynomial +function that has the specified properties. +\begin{subproblem} + Degree 2 and has zeros at $4$ and $5$. + \begin{shortsolution} + Possible option: $p(x)=(x-4)(x-5)$. Note we could multiply $p$ by any real number, and still meet the requirements. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Degree 3 and has zeros at $4$,$5$ and $-3$. + \begin{shortsolution} + Possible option: $p(x)=(x-4)(x-5)(x+3)$. Note we could multiply $p$ by any real number, and still meet the requirements. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Degree 4 and has zeros at $0$, $4$, $5$, $-3$. + \begin{shortsolution} + Possible option: $p(x)=x(x-4)(x-5)(x+3)$. Note we could multiply $p$ by any real number, and still meet the requirements. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Degree 4, with zeros that make the graph cut at $2$, $-5$, and a zero that makes the graph touch at $-2$; + \begin{shortsolution} + Possible option: $p(x)=(x-2)(x+5)(x+2)^2$. Note we could multiply $p$ by any real number, and still meet the requirements. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Degree 3, with only one zero at $-1$. + \begin{shortsolution} + Possible option: $p(x)=(x+1)^3$. Note we could multiply $p$ by any real number, and still meet the requirements. + \end{shortsolution} +\end{subproblem} +\end{problem} +%=================================== +% Author: Hughes +% Date: June 2012 +%=================================== +\begin{problem}[\Cref{poly:step:last}] +\pccname{Saheed} is graphing a polynomial function, $p$. +He is following \crefrange{poly:step:first}{poly:step:last} and has so far +marked the zeros of $p$ on \cref{poly:fig:optionsp1}. Saheed tells you that +$p$ has degree $3$, but does \emph{not} say if the leading coefficient +of $p$ is positive or negative. +\begin{figure}[!htbp] + \begin{widepage} + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-15}, + width=\textwidth, + height=.5\textwidth, + ] + \addplot[soldot] coordinates{(-5,0)(2,0)(6,0)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:optionsp1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-15}, + width=\textwidth, + height=.5\textwidth, + ] + \addplot[soldot] coordinates{(-5,0)(6,0)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:optionsp2} + \end{subfigure}% + \caption{} + \end{widepage} +\end{figure} +\begin{subproblem} + Use the information in \cref{poly:fig:optionsp1} to help sketch $p$, assuming that the leading coefficient + is positive. + \begin{shortsolution} + Assuming that $a_3>0$: + + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-15}, + width=\solutionfigurewidth, + ] + \addplot expression[domain=-6.78179:8.35598,samples=50]{1/20*(x+5)*(x-2)*(x-6)}; + \addplot[soldot] coordinates{(-5,0)(2,0)(6,0)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Use the information in \cref{poly:fig:optionsp1} to help sketch $p$, assuming that the leading coefficient + is negative. + \begin{shortsolution} + Assuming that $a_3<0$: + + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-15}, + width=\solutionfigurewidth, + ] + \addplot expression[domain=-6.78179:8.35598,samples=50]{-1/20*(x+5)*(x-2)*(x-6)}; + \addplot[soldot] coordinates{(-5,0)(2,0)(6,0)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} +\end{subproblem} +Saheed now turns his attention to another polynomial function, $q$. He finds +the zeros of $q$ (there are only $2$) and marks them on \cref{poly:fig:optionsp2}. +Saheed knows that $q$ has degree $3$, but doesn't know if the leading +coefficient is positive or negative. +\begin{subproblem} + Use the information in \cref{poly:fig:optionsp2} to help sketch $q$, assuming that the leading + coefficient of $q$ is positive. Hint: only one of the zeros is simple. + \begin{shortsolution} + Assuming that $a_4>0$ there are $2$ different options: + + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-15}, + width=\solutionfigurewidth, + ] + \addplot expression[domain=-8.68983:7.31809,samples=50]{1/20*(x+5)^2*(x-6)}; + \addplot expression[domain=-6.31809:9.68893,samples=50]{1/20*(x+5)*(x-6)^2}; + \addplot[soldot] coordinates{(-5,0)(6,0)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Use the information in \cref{poly:fig:optionsp2} to help sketch $q$, assuming that the leading + coefficient of $q$ is negative. + \begin{shortsolution} + Assuming that $a_4<0$ there are $2$ different options: + + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-15}, + width=\solutionfigurewidth, + ] + \addplot expression[domain=-8.68983:7.31809,samples=50]{-1/20*(x+5)^2*(x-6)}; + \addplot expression[domain=-6.31809:9.68893,samples=50]{-1/20*(x+5)*(x-6)^2}; + \addplot[soldot] coordinates{(-5,0)(6,0)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} +\end{subproblem} +\end{problem} +%=================================== +% Author: Hughes +% Date: June 2012 +%=================================== +\begin{problem}[Zeros] +Find all zeros of each of the following polynomial functions, making +sure to detail their multiplicity. Note that +you may need to use factoring, or the quadratic formula, or both! Also note +that some zeros may be repeated, and some may be complex. +\begin{multicols}{3} + \begin{subproblem} + $p(x)=x^2+1$ + \begin{shortsolution} + $\pm i$ (simple). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $q(y)=(y^2-9)(y^2-7)$ + \begin{shortsolution} + $\pm 3$, $\pm \sqrt{7}$ (all are simple). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $r(z)=-4z^3(z^2+3)(z^2+64)$ + \begin{shortsolution} + $0$ (multiplicity $3$), $\pm\sqrt{3}$ (simple), $\pm\sqrt{8}$ (simple). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $a(x)=x^4-81$ + \begin{shortsolution} + $\pm 3$, $\pm 3i$ (all are simple). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $b(y)=y^3-8$ + \begin{shortsolution} + $2$, $-1\pm i\sqrt{3}$ (all are simple). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $c(m)=m^3-m^2$ + \begin{shortsolution} + $0$ (multiplicity $2$), $1$ (simple). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $h(n)=(n+1)(n^2+4)$ + \begin{shortsolution} + $-1$, $\pm 2i$ (all are simple). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $f(\alpha)=(\alpha^2-16)(\alpha^2-5\alpha+4)$ + \begin{shortsolution} + $-4$ (simple), $4$ (multiplicity $2$), $1$ (simple). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $g(\beta)=(\beta^2-25)(\beta^2-5\beta-4)$ + \begin{shortsolution} + $\pm 5$, $\dfrac{5\pm\sqrt{41}}{2}$ (all are simple). + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} +%=================================== +% Author: Hughes +% Date: June 2012 +%=================================== +\begin{problem}[Given zeros, find a formula] +In each of the following problems you are given the zeros of a polynomial. +Write a possible formula for each polynomial| you may leave your +answer in factored form, but it may not contain complex numbers. Unless +otherwise stated, assume that the zeros are simple. +\begin{multicols}{3} + \begin{subproblem} + $1$, $2$ + \begin{shortsolution} + $p(x)=(x-1)(x-2)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $0$, $5$, $13$ + \begin{shortsolution} + $p(x)=x(x-5)(x-13)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $-7$, $2$ (multiplicity $3$), $5$ + \begin{shortsolution} + $p(x)=(x+7)(x-2)^3(x-5)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $0$, $\pm i$ + \begin{shortsolution} + $p(x)=x(x^2+1)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $\pm 2i$, $\pm 7$ + \begin{shortsolution} + $p(x)=(x^2+4)(x^2-49)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $-2\pm i\sqrt{6}$ + \end{subproblem} +\end{multicols} +\end{problem} +%=================================== +% Author: Hughes +% Date: June 2012 +%=================================== +\begin{problem}[Composition of polynomials] +Let $p$ and $q$ be polynomial functions that have formulas +\[ + p(x)=(x+1)(x+2)(x+5), \qquad q(x)=3-x^4 +\] +Evaluate each of the following. +\begin{multicols}{4} + \begin{subproblem} + $(p\circ q)(0)$ + \begin{shortsolution} + $160$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(q\circ p)(0)$ + \begin{shortsolution} + $-9997$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(p\circ q)(1)$ + \begin{shortsolution} + $84$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(p\circ p)(0)$ + \begin{shortsolution} + $1980$ + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} +%=================================== +% Author: Hughes +% Date: June 2012 +%=================================== +\begin{problem}[Piecewise polynomial functions] +Let $P$ be the piecewise-defined function with formula +\[ + P(x)=\begin{cases} + (1-x)(2x+5)(x^2+1), & x\leq -3\\ + 4-x^2, & -3<x < 4\\ + x^3 & x\geq 4 +\end{cases} +\] +Evaluate each of the following +\begin{multicols}{5} + \begin{subproblem} + $P(-4)$ + \begin{shortsolution} + $-255$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $P(0)$ + \begin{shortsolution} + $4$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $P(4)$ + \begin{shortsolution} + $64$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $P(-3)$ + \begin{shortsolution} + $-40$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(P\circ P)(0)$ + \begin{shortsolution} + $64$ + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} + +%=================================== +% Author: Hughes +% Date: July 2012 +%=================================== +\begin{problem}[Function algebra] +Let $p$ and $q$ be the polynomial functions that have formulas +\[ + p(x)=x(x+1)(x-3)^2, \qquad q(x)=7-x^2 +\] +Evaluate each of the following (if possible). +\begin{multicols}{4} + \begin{subproblem} + $(p+q)(1)$ + \begin{shortsolution} + $14$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(p-q)(0)$ + \begin{shortsolution} + $7$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(p\cdot q)(\sqrt{7})$ + \begin{shortsolution} + $0$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $\left( \frac{q}{p} \right)(1)$ + \begin{shortsolution} + $\frac{3}{4}$ + \end{shortsolution} + \end{subproblem} +\end{multicols} +\begin{subproblem} + What is the domain of the function $\frac{q}{p}$? + \begin{shortsolution} + $(-\infty,-1)\cup (-1,0)\cup (0,3)\cup (3,\infty)$ + \end{shortsolution} +\end{subproblem} +\end{problem} + +%=================================== +% Author: Hughes +% Date: July 2012 +%=================================== +\begin{problem}[Transformations: given the transformation, find the formula] +Let $p$ be the polynomial function that has formula. +\[ + p(x)=4x(x^2-1)(x+3) +\] +In each of the following +problems apply the given transformation to the function $p$ and +write a formula for the transformed version of $p$. +\begin{multicols}{2} + \begin{subproblem} + Shift $p$ to the right by $5$ units. + \begin{shortsolution} + $p(x-5)=4(x-5)(x-2)(x^2-10x+24)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Shift $p$ to the left by $6$ units. + \begin{shortsolution} + $p(x+6)=4(x+6)(x+9)(x^2+12x+35)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Shift $p$ up by $12$ units. + \begin{shortsolution} + $p(x)+12=4x(x^2-1)(x+3)+12$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Shift $p$ down by $2$ units. + \begin{shortsolution} + $p(x)-2=4x(x^2-1)(x+3)-2$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Reflect $p$ over the horizontal axis. + \begin{shortsolution} + $-p(x)=-4x(x^2-1)(x+3)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Reflect $p$ over the vertical axis. + \begin{shortsolution} + $p(-x)=-4x(x^2-1)(3-x)$ + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{problem}[Find a formula from a table]\label{poly:prob:findformula} +\Crefrange{poly:tab:findformulap}{poly:tab:findformulas} show values of polynomial functions, $p$, $q$, +$r$, and $s$. + +\begin{table}[!htb] + \centering + \begin{widepage} + \caption{Tables for \cref{poly:prob:findformula}} + \label{poly:tab:findformula} + \begin{subtable}{.2\textwidth} + \centering + \caption{$y=p(x)$} + \label{poly:tab:findformulap} + \begin{tabular}{rr} + \beforeheading + \heading{$x$} & \heading{$y$} \\ + \afterheading + $-4$ & $-56$ \\\normalline + $-3$ & $-18$ \\\normalline + $-2$ & $0$ \\\normalline + $-1$ & $4$ \\\normalline + $0$ & $0$ \\\normalline + $1$ & $-6$ \\\normalline + $2$ & $-8$ \\\normalline + $3$ & $0$ \\\normalline + $4$ & $24$ \\\lastline + \end{tabular} + \end{subtable} + \hfill + \begin{subtable}{.2\textwidth} + \centering + \caption{$y=q(x)$} + \label{poly:tab:findformulaq} + \begin{tabular}{rr} + \beforeheading + \heading{$x$} & \heading{$y$} \\ \afterheading + $-4$ & $-16$ \\\normalline + $-3$ & $-3$ \\\normalline + $-2$ & $0$ \\\normalline + $-1$ & $-1$ \\\normalline + $0$ & $0$ \\\normalline + $1$ & $9$ \\\normalline + $2$ & $32$ \\\normalline + $3$ & $75$ \\\normalline + $4$ & $144$ \\\lastline + \end{tabular} + \end{subtable} + \hfill + \begin{subtable}{.2\textwidth} + \centering + \caption{$y=r(x)$} + \label{poly:tab:findformular} + \begin{tabular}{rr} + \beforeheading + \heading{$x$} & \heading{$y$} \\ \afterheading + $-4$ & $105$ \\\normalline + $-3$ & $0$ \\\normalline + $-2$ & $-15$ \\\normalline + $-1$ & $0$ \\\normalline + $0$ & $9$ \\\normalline + $1$ & $0$ \\\normalline + $2$ & $-15$ \\\normalline + $3$ & $0$ \\\normalline + $4$ & $105$ \\\lastline + \end{tabular} + \end{subtable} + \hfill + \begin{subtable}{.2\textwidth} + \centering + \caption{$y=s(x)$} + \label{poly:tab:findformulas} + \begin{tabular}{rr} + \beforeheading + \heading{$x$} & \heading{$y$} \\ \afterheading + $-4$ & $75$ \\\normalline + $-3$ & $0$ \\\normalline + $-2$ & $-9$ \\\normalline + $-1$ & $0$ \\\normalline + $0$ & $3$ \\\normalline + $1$ & $0$ \\\normalline + $2$ & $15$ \\\normalline + $3$ & $96$ \\\normalline + $4$ & $760$ \\\lastline + \end{tabular} + \end{subtable} + \end{widepage} +\end{table} + +\begin{subproblem} + Assuming that all of the zeros of $p$ are shown (in \cref{poly:tab:findformulap}), how many zeros does $p$ have? + \begin{shortsolution} + $p$ has 3 zeros. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + What is the degree of $p$? + \begin{shortsolution} + $p$ is degree 3. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Write a formula for $p(x)$. + \begin{shortsolution} + $p(x)=x(x+2)(x-3)$ + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Assuming that all of the zeros of $q$ are shown (in \cref{poly:tab:findformulaq}), how many zeros does $q$ have? + \begin{shortsolution} + $q$ has 2 zeros. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Describe the difference in behavior of $p$ and $q$ at $-2$. + \begin{shortsolution} + $p$ changes sign at $-2$, and $q$ does not change sign at $-2$. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Given that $q$ is a degree-$3$ polynomial, write a formula for $q(x)$. + \begin{shortsolution} + $q(x)=x(x+2)^2$ + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Assuming that all of the zeros of $r$ are shown (in \cref{poly:tab:findformular}), find a formula for $r(x)$. + \begin{shortsolution} + $r(x)=(x+3)(x+1)(x-1)(x-3)$ + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Assuming that all of the zeros of $s$ are shown (in \cref{poly:tab:findformulas}), find a formula for $s(x)$. + \begin{shortsolution} + $s(x)=(x+3)(x+1)(x-1)^2$ + \end{shortsolution} +\end{subproblem} +\end{problem} +\end{exercises} + +\section{Rational functions} +\subsection*{Power functions with negative exponents} +The study of rational functions will rely upon a good knowledge +of power functions with negative exponents. \Cref{rat:ex:oddpow,rat:ex:evenpow} are +simple but fundamental to understanding the behavior of rational functions. +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{pccexample}[Power functions with odd negative exponents]\label{rat:ex:oddpow} +Graph each of the following functions on your calculator, state their domain in interval notation, and their +behavior as $x\rightarrow 0^-$ and $x\rightarrow 0^+$. +\[ + f(x)=\frac{1}{x},\qquad g(x)=\dfrac{1}{x^3},\qquad h(x)=\dfrac{1}{x^5} +\] +\begin{pccsolution} +The functions $f$, $g$, and $k$ are plotted in \cref{rat:fig:oddpow}. +The domain of each of the functions $f$, $g$, and $h$ is $(-\infty,0)\cup (0,\infty)$. Note that +the long-run behavior of each of the functions is the same, and in particular +\begin{align*} + f(x)\rightarrow 0 & \text{ as } x\rightarrow\infty \\ + \mathllap{\text{and }} f(x)\rightarrow 0 & \text{ as } x\rightarrow-\infty +\end{align*} +The same results hold for $g$ and $h$. Note also that each of the functions +has a \emph{vertical asymptote} at $0$. We see that +\begin{align*} + f(x)\rightarrow -\infty & \text{ as } x\rightarrow 0^- \\ + \mathllap{\text{and }} f(x)\rightarrow \infty & \text{ as } x\rightarrow 0^+ +\end{align*} +The same results hold for $g$ and $h$. + +The curve of a function that has a vertical asymptote is necessarily separated +into \emph{branches}| each of the functions $f$, $g$, and $h$ have $2$ branches. +\end{pccsolution} +\end{pccexample} + +\begin{figure}[!htb] + \begin{minipage}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-3,xmax=3, + ymin=-5,ymax=5, + xtick={-2,-1,...,2}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\textwidth, + legend pos=north west, + ] + \addplot expression[domain=-3:-0.2]{1/x}; + \addplot expression[domain=-3:-0.584]{1/x^3}; + \addplot expression[domain=-3:-0.724]{1/x^5}; + \addplot expression[domain=0.2:3]{1/x}; + \addplot expression[domain=0.584:3]{1/x^3}; + \addplot expression[domain=0.724:3]{1/x^5}; + \addplot[soldot]coordinates{(-1,-1)}node[axisnode,anchor=north east]{$(-1,-1)$}; + \addplot[soldot]coordinates{(1,1)}node[axisnode,anchor=south west]{$(1,1)$}; + \legend{$f$,$g$,$h$} + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:oddpow} + \end{minipage}% + \hfill + \begin{minipage}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-3,xmax=3, + ymin=-5,ymax=5, + xtick={-2,-1,...,2}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\textwidth, + legend pos=south east, + ] + \addplot expression[domain=-3:-0.447]{1/x^2}; + \addplot expression[domain=-3:-0.668]{1/x^4}; + \addplot expression[domain=-3:-0.764]{1/x^6}; + \addplot expression[domain=0.447:3]{1/x^2}; + \addplot expression[domain=0.668:3]{1/x^4}; + \addplot expression[domain=0.764:3]{1/x^6}; + \addplot[soldot]coordinates{(-1,1)}node[axisnode,anchor=south east]{$(-1,1)$}; + \addplot[soldot]coordinates{(1,1)}node[axisnode,anchor=south west]{$(1,1)$}; + \legend{$F$,$G$,$H$} + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:evenpow} + \end{minipage}% +\end{figure} + + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{pccexample}[Power functions with even negative exponents]\label{rat:ex:evenpow}% +Graph each of the following functions, state their domain, and their +behavior as $x\rightarrow 0^-$ and $x\rightarrow 0^+$. +\[ + f(x)=\frac{1}{x^2},\qquad g(x)=\frac{1}{x^4},\qquad h(x)=\frac{1}{x^6} +\] +\begin{pccsolution} +The functions $F$, $G$, and $H$ are plotted in \cref{rat:fig:evenpow}. +The domain of each of the functions $F$, $G$, and $H$ is $(-\infty,0)\cup (0,\infty)$. Note that +the long-run behavior of each of the functions is the same, and in particular +\begin{align*} + F(x)\rightarrow 0 & \text{ as } x\rightarrow\infty \\ + \mathllap{\text{and }} f(x)\rightarrow 0 & \text{ as } x\rightarrow-\infty +\end{align*} +As in \cref{rat:ex:oddpow}, $F$ has a horizontal asymptote that +has equation $y=0$. +The same results hold for $G$ and $H$. Note also that each of the functions +has a \emph{vertical asymptote} at $0$. We see that +\begin{align*} + F(x)\rightarrow \infty & \text{ as } x\rightarrow 0^- \\ + \mathllap{\text{and }} F(x)\rightarrow \infty & \text{ as } x\rightarrow 0^+ +\end{align*} +The same results hold for $G$ and $H$. Each of the functions $F$, $G$, and $H$ +have $2$ branches. +\end{pccsolution} +\end{pccexample} +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{doyouunderstand} + \begin{problem} + Repeat \cref{rat:ex:oddpow,rat:ex:evenpow} using (respectively) + \begin{subproblem} + $k(x)=-\dfrac{1}{x}$, $ m(x)=-\dfrac{1}{x^3}$, $ n(x)=-\dfrac{1}{x^5}$ + \begin{shortsolution} + The functions $k$, $m$, and $n$ have domain $(-\infty,0)\cup (0,\infty)$, and + are graphed below. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-3,xmax=3, + ymin=-5,ymax=5, + xtick={-2,-1,...,2}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\solutionfigurewidth, + legend pos=north east, + ] + \addplot expression[domain=-3:-0.2]{-1/x}; + \addplot expression[domain=-3:-0.584]{-1/x^3}; + \addplot expression[domain=-3:-0.724]{-1/x^5}; + \addplot expression[domain=0.2:3]{-1/x}; + \addplot expression[domain=0.584:3]{-1/x^3}; + \addplot expression[domain=0.724:3]{-1/x^5}; + \legend{$k$,$m$,$n$} + \end{axis} + \end{tikzpicture} + + Note that + \begin{align*} + k(x)\rightarrow 0 & \text{ as } x\rightarrow\infty \\ + \mathllap{\text{and }} k(x)\rightarrow 0 & \text{ as } x\rightarrow-\infty \\ + \intertext{and also} + k(x)\rightarrow \infty & \text{ as } x\rightarrow 0^- \\ + \mathllap{\text{and }} k(x)\rightarrow -\infty & \text{ as } x\rightarrow 0^+ + \end{align*} + The same are true for $m$ and $n$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $ K(x)=-\dfrac{1}{x^2}$, $ M(x)=-\dfrac{1}{x^4}$, $ N(x)=-\dfrac{1}{x^6}$ + \begin{shortsolution} + The functions $K$, $M$, and $N$ have domain $(-\infty,0)\cup (0,\infty)$, and + are graphed below. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-3,xmax=3, + ymin=-5,ymax=5, + xtick={-2,-1,...,2}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\solutionfigurewidth, + legend pos=north east, + ] + \addplot expression[domain=-3:-0.447]{-1/x^2}; + \addplot expression[domain=-3:-0.668]{-1/x^4}; + \addplot expression[domain=-3:-0.764]{-1/x^6}; + \addplot expression[domain=0.447:3]{-1/x^2}; + \addplot expression[domain=0.668:3]{-1/x^4}; + \addplot expression[domain=0.764:3]{-1/x^6}; + \legend{$K$,$M$,$N$} + \end{axis} + \end{tikzpicture} + + Note that + \begin{align*} + K(x)\rightarrow 0 & \text{ as } x\rightarrow\infty \\ + \mathllap{\text{and }} K(x)\rightarrow 0 & \text{ as } x\rightarrow-\infty \\ + \intertext{and also} + K(x)\rightarrow -\infty & \text{ as } x\rightarrow 0^- \\ + \mathllap{\text{and }} K(x)\rightarrow -\infty & \text{ as } x\rightarrow 0^+ + \end{align*} + The same are true for $M$ and $N$. + \end{shortsolution} + \end{subproblem} + \end{problem} +\end{doyouunderstand} + +\subsection*{Rational functions} +\begin{pccdefinition}[Rational functions]\label{rat:def:function} +Rational functions have the form +\[ + r(x) = \frac{p(x)}{q(x)} +\] +where both $p$ and $q$ are polynomials. + +Note that +\begin{itemize} + \item the domain or $r$ will be all real numbers, except those that + make the \emph{denominator}, $q(x)$, equal to $0$; + \item the zeros of $r$ are the zeros of $p$, i.e the real numbers + that make the \emph{numerator}, $p(x)$, equal to $0$. +\end{itemize} + +\Cref{rat:ex:oddpow,rat:ex:evenpow} are particularly important because $r$ +will behave like $\frac{1}{x}$, or $\frac{1}{x^2}$ around its vertical asymptotes, +depending on the power that the relevant term is raised to| we will demonstrate +this in what follows. +\end{pccdefinition} + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{pccexample}[Rational or not] +Identify whether each of the following functions is a rational or not. If +the function is rational, state the domain. +\begin{multicols}{3} + \begin{enumerate} + \item $r(x)=\dfrac{1}{x}$ + \item $f(x)=2^x+3$ + \item $g(x)=19$ + \item $h(x)=\dfrac{3+x}{4-x}$ + \item $k(x)=\dfrac{x^3+2x}{x-15}$ + \item $l(x)=9-4x$ + \item $m(x)=\dfrac{x+5}{(x-7)(x+9)}$ + \item $n(x)=x^2+6x+7$ + \item $q(x)=1-\dfrac{3}{x+1}$ + \end{enumerate} +\end{multicols} +\begin{pccsolution} +\begin{enumerate} + \item $r$ is rational; the domain of $r$ is $(-\infty,0)\cup(0,\infty)$. + \item $f$ is not rational. + \item $g$ is not rational; $g$ is constant. + \item $h$ is rational; the domain of $h$ is $(-\infty,4)\cup(4,\infty)$. + \item $k$ is rational; the domain of $k$ is $(-\infty,15)\cup(15,\infty)$. + \item $l$ is not rational; $l$ is linear. + \item $m$ is rational; the domain of $m$ is $(-\infty,-9)\cup(-9,7)\cup(7,\infty)$. + \item $n$ is not rational; $n$ is quadratic (or you might describe $n$ as a polynomial). + \item $q$ is rational; the domain of $q$ is $(-\infty,-1)\cup (-1,\infty)$. +\end{enumerate} +\end{pccsolution} +\end{pccexample} + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{pccexample}[Match formula to graph] +Each of the following functions is graphed in \cref{rat:fig:whichiswhich}. +Which is which? +\[ + r(x)=\frac{1}{x-3}, \qquad q(x)=\frac{x-2}{x+5}, \qquad k(x)=\frac{1}{(x+2)(x-3)} +\] +\begin{figure}[!htb] + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x-2)/(x+5);}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-6,ymax=6, + xtick={-8,-6,...,8}, + minor ytick={-4,-3,...,4}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:-6.37]{f}; + \addplot[pccplot] expression[domain=-3.97:10]{f}; + \addplot[soldot] coordinates{(2,0)}; + \addplot[asymptote,domain=-6:6]({-5},{x}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:which1} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=1/(x-3);}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-5,ymax=6, + xtick={-8,-6,...,8}, + ytick={-4,4}, + minor ytick={-3,...,5}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:2.8]{f}; + \addplot[pccplot] expression[domain=3.17:10]{f}; + \addplot[asymptote,domain=-6:6]({3},{x}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:which2} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=1/((x-3)*(x+2));}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-5,ymax=5, + xtick={-8,-6,...,8}, + ytick={-4,4}, + minor ytick={-3,...,3}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:-2.03969]{f}; + \addplot[pccplot] expression[domain=-1.95967:2.95967]{f}; + \addplot[pccplot] expression[domain=3.03969:10]{f}; + \addplot[asymptote,domain=-5:5]({-2},{x}); + \addplot[asymptote,domain=-5:5]({3},{x}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:which3} + \end{subfigure} + \caption{} + \label{rat:fig:whichiswhich} +\end{figure} + +\begin{pccsolution} +Let's start with the function $r$. Note that domain of $r$ is $(-\infty,3)\cup(0,3)$, so +we search for a function that has a vertical asymptote at $3$. There +are two possible choices: the functions graphed in \cref{rat:fig:which2,rat:fig:which3}, +but note that the function in \cref{rat:fig:which3} also has a vertical asymptote at $-2$ +which is not consistent with the formula for $r(x)$. Therefore, $y=r(x)$ +is graphed in \cref{rat:fig:which2}. + +The function $q$ has domain $(-\infty,-5)\cup(-5,\infty)$, so we search +for a function that has a vertical asymptote at $-5$. The only candidate +is the curve shown in \cref{rat:fig:which1}; note that the curve also goes through $(2,0)$, +which is consistent with the formula for $q(x)$, since $q(2)=0$, i.e $q$ +has a zero at $2$. + +The function $k$ has domain $(-\infty,-2)\cup(-2,3)\cup(3,\infty)$, and +has vertical asymptotes at $-2$ and $3$. This is consistent with +the graph in \cref{rat:fig:which3} (and is the only curve that +has $3$ branches). + +We note that each function behaves like $\frac{1}{x}$ around its vertical asymptotes, +because each linear factor in each denominator is raised to the power $1$; if (for example) +the definition of $r$ was instead +\[ + r(x)=\frac{1}{(x-3)^2} +\] +then we would see that $r$ behaves like $\frac{1}{x^2}$ around its vertical asymptote, and +the graph of $r$ would be very different. We will deal with these cases in the examples that follow. +\end{pccsolution} +\end{pccexample} + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{pccexample}[Repeated factors in the denominator] +Consider the functions $f$, $g$, and $h$ that have formulas +\[ + f(x)=\frac{x-2}{(x-3)(x+2)}, \qquad g(x)=\frac{x-2}{(x-3)^2(x+2)}, \qquad h(x)=\frac{x-2}{(x-3)(x+2)^2} +\] +which are graphed in \cref{rat:fig:repfactd}. Note that each function has $2$ +vertical asymptotes, and the domain of each function is +\[ + (-\infty,-2)\cup(-2,3)\cup(3,\infty) +\] +so we are not surprised to see that each curve has $3$ branches. We also note that +the numerator of each function is the same, which tells us that each function has +only $1$ zero at $2$. + +The functions $g$ and $h$ are different from those that we have considered previously, +because they have a repeated factor in the denominator. Notice in particular +the way that the functions behave around their asymptotes: +\begin{itemize} + \item $f$ behaves like $\frac{1}{x}$ around both of its asymptotes; + \item $g$ behaves like $\frac{1}{x}$ around $-2$, and like $\frac{1}{x^2}$ around $3$; + \item $h$ behaves like $\frac{1}{x^2}$ around $-2$, and like $\frac{1}{x}$ around $3$. +\end{itemize} +\end{pccexample} +\begin{figure}[!htb] + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x-2)/((x+2)*(x-3));}] + \begin{axis}[ + % framed, + xmin=-5,xmax=5, + ymin=-4,ymax=4, + xtick={-4,-2,...,4}, + ytick={-2,2}, + % grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-5:-2.201]{f}; + \addplot[pccplot] expression[domain=-1.802:2.951]{f}; + \addplot[pccplot] expression[domain=3.052:5]{f}; + \addplot[soldot] coordinates{(2,0)}; + % \addplot[asymptote,domain=-6:6]({-2},{x}); + % \addplot[asymptote,domain=-6:6]({3},{x}); + \end{axis} + \end{tikzpicture} + \caption{$y=\dfrac{x-2}{(x+2)(x-3)}$} + \label{rat:fig:repfactd1} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x-2)/((x+2)*(x-3)^2);}] + \begin{axis}[ + % framed, + xmin=-5,xmax=5, + ymin=-4,ymax=4, + xtick={-4,-2,...,4}, + ytick={-2,2}, + % grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-5:-2.039]{f}; + \addplot[pccplot] expression[domain=-1.959:2.796]{f}; + \addplot[pccplot] expression[domain=3.243:5]{f}; + \addplot[soldot] coordinates{(2,0)}; + % \addplot[asymptote,domain=-4:4]({-2},{x}); + % \addplot[asymptote,domain=-4:4]({3},{x}); + \end{axis} + \end{tikzpicture} + \caption{$y=\dfrac{x-2}{(x+2)(x-3)^2}$} + \label{rat:fig:repfactd2} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x-2)/((x+2)^2*(x-3));}] + \begin{axis}[ + % framed, + xmin=-5,xmax=5, + ymin=-4,ymax=4, + xtick={-4,-2,...,2}, + ytick={-2,2}, + % grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-5:-2.451]{f}; + \addplot[pccplot] expression[domain=-1.558:2.990]{f}; + \addplot[pccplot] expression[domain=3.010:6]{f}; + \addplot[soldot] coordinates{(2,0)}; + % \addplot[asymptote,domain=-4:4]({-2},{x}); + % \addplot[asymptote,domain=-4:4]({3},{x}); + \end{axis} + \end{tikzpicture} + \caption{$y=\dfrac{x-2}{(x+2)^2(x-3)}$} + \label{rat:fig:repfactd3} + \end{subfigure} + \caption{} + \label{rat:fig:repfactd} +\end{figure} + +\Cref{rat:def:function} says that the zeros of +the rational function $r$ that has formula $r(x)=\frac{p(x)}{q(x)}$ are +the zeros of $p$. Let's explore this a little more. +%=================================== +% Author: Hughes +% Date: May 2012 +%=================================== +\begin{pccexample}[Zeros] Find the zeros of each of the following functions +\[ + \alpha(x)=\frac{x+5}{3x-7}, \qquad \beta(x)=\frac{9-x}{x+1}, \qquad \gamma(x)=\frac{17x^2-10}{2x+1} +\] +\begin{pccsolution} +We find the zeros of each function in turn by setting the numerator equal to $0$. The zeros of +$\alpha$ are found by solving +\[ + x+5=0 +\] +The zero of $\alpha$ is $-5$. + +Similarly, we may solve $9-x=0$ to find the zero of $\beta$, which is clearly $9$. + +The zeros of $\gamma$ satisfy the equation +\[ + 17x^2-10=0 +\] +which we can solve using the square root property to obtain +\[ + x=\pm\frac{10}{17} +\] +The zeros of $\gamma$ are $\pm\frac{10}{17}$. +\end{pccsolution} +\end{pccexample} + +\subsection*{Long-run behavior} +Our focus so far has been on the behavior of rational functions around +their \emph{vertical} asymptotes. In fact, rational functions also +have interesting long-run behavior around their \emph{horizontal} or +\emph{oblique} asymptotes. A rational function will always have either +a horizontal or an oblique asymptote| the case is determined by the degree +of the numerator and the degree of the denominator. +\begin{pccdefinition}[Long-run behavior]\label{rat:def:longrun} +Let $r$ be the rational function that has formula +\[ + r(x) = \frac{a_n x^n + a_{n-1}x^{n-1}+\ldots + a_0}{b_m x^m + b_{m-1}x^{m-1}+\ldots+b_0} +\] +We can classify the long-run behavior of the rational function $r$ +according to the following criteria: +\begin{itemize} + \item if $n<m$ then $r$ has a horizontal asymptote with equation $y=0$; + \item if $n=m$ then $r$ has a horizontal asymptote with equation $y=\dfrac{a_n}{b_m}$; + \item if $n>m$ then $r$ will have an oblique asymptote as $x\rightarrow\pm\infty$ (more on this in \cref{rat:sec:oblique}) +\end{itemize} +\end{pccdefinition} +We will concentrate on functions that have horizontal asymptotes until +we reach \cref{rat:sec:oblique}. + +%=================================== +% Author: Hughes +% Date: May 2012 +%=================================== +\begin{pccexample}[Long-run behavior graphically]\label{rat:ex:horizasymp} +\pccname{Kebede} has graphed the following functions in his graphing calculator +\[ + r(x)=\frac{x+1}{x-3}, \qquad s(x)=\frac{2(x+1)}{x-3}, \qquad t(x)=\frac{3(x+1)}{x-3} +\] +and obtained the curves shown in \cref{rat:fig:horizasymp}. Kebede decides +to test his knowledgeable friend \pccname{Oscar}, and asks him +to match the formulas to the graphs. + +\begin{figure}[!htb] + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=2*(x+1)/(x-3);}] + \begin{axis}[ + framed, + xmin=-15,xmax=15, + ymin=-6,ymax=6, + xtick={-12,-8,...,12}, + minor ytick={-4,-3,...,4}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-15:2]{f}; + \addplot[pccplot] expression[domain=5:15]{f}; + \addplot[soldot] coordinates{(-1,0)}; + \addplot[asymptote,domain=-6:6]({3},{x}); + \addplot[asymptote,domain=-15:15]({x},{2}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:horizasymp1} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x+1)/(x-3);}] + \begin{axis}[ + framed, + xmin=-15,xmax=15, + ymin=-6,ymax=6, + xtick={-12,-8,...,12}, + minor ytick={-4,-3,...,4}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-15:2.42857,samples=50]{f}; + \addplot[pccplot] expression[domain=3.8:15,samples=50]{f}; + \addplot[soldot] coordinates{(-1,0)}; + \addplot[asymptote,domain=-6:6]({3},{x}); + \addplot[asymptote,domain=-15:15]({x},{1}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:horizasymp2} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=3*(x+1)/(x-3);}] + \begin{axis}[ + framed, + xmin=-15,xmax=15, + ymin=-6,ymax=6, + xtick={-12,-8,...,12}, + minor ytick={-4,-3,...,4}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-15:1.6666,samples=50]{f}; + \addplot[pccplot] expression[domain=7:15]{f}; + \addplot[soldot] coordinates{(-1,0)}; + \addplot[asymptote,domain=-6:6]({3},{x}); + \addplot[asymptote,domain=-15:15]({x},{3}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:horizasymp3} + \end{subfigure} + \caption{Horizontal asymptotes} + \label{rat:fig:horizasymp} +\end{figure} + +Oscar notices that each function has a vertical asymptote at $3$ and a zero at $-1$. +The main thing that catches Oscar's eye is that each function has a different +coefficient in the numerator, and that each curve has a different horizontal asymptote. +In particular, Oscar notes that +\begin{itemize} + \item the curve shown in \cref{rat:fig:horizasymp1} has a horizontal asymptote with equation $y=2$; + \item the curve shown in \cref{rat:fig:horizasymp2} has a horizontal asymptote with equation $y=1$; + \item the curve shown in \cref{rat:fig:horizasymp3} has a horizontal asymptote with equation $y=3$. +\end{itemize} +Oscar is able to tie it all together for Kebede by referencing \cref{rat:def:longrun}. He says +that since the degree of the numerator and the degree of the denominator is the same +for each of the functions $r$, $s$, and $t$, the horizontal asymptote will be determined +by evaluating the ratio of their leading coefficients. + +Oscar therefore says that $r$ should have a horizontal asymptote $y=\frac{1}{1}=1$, $s$ should +have a horizontal asymptote $y=\frac{2}{1}=2$, and $t$ should have a horizontal asymptote +$y=\frac{3}{1}=3$. Kebede is able to finish the problem from here, and says that $r$ is +shown in \cref{rat:fig:horizasymp2}, $s$ is shown in \cref{rat:fig:horizasymp1}, and +$t$ is shown in \cref{rat:fig:horizasymp3}. +\end{pccexample} + +%=================================== +% Author: Hughes +% Date: May 2012 +%=================================== +\begin{pccexample}[Long-run behavior numerically] +\pccname{Xiao} and \pccname{Dwayne} saw \cref{rat:ex:horizasymp} but are a little confused +about horizontal asymptotes. What does it mean to say that a function $r$ has a horizontal +asymptote? + +They decide to explore the concept by +constructing a table of values for the rational functions $R$ and $S$ that have formulas +\[ + R(x)=\frac{-5(x+1)}{x-3}, \qquad S(x)=\frac{7(x-5)}{2(x+1)} +\] +In \cref{rat:tab:plusinfty} they model the behavior of $R$ and $S$ as $x\rightarrow\infty$, +and in \cref{rat:tab:minusinfty} they model the behavior of $R$ and $S$ as $x\rightarrow-\infty$ +by substituting very large values of $|x|$ into each function. +\begin{table}[!htb] + \begin{minipage}{.5\textwidth} + \centering + \caption{$R$ and $S$ as $x\rightarrow\infty$} + \label{rat:tab:plusinfty} + \begin{tabular}{crr} + \beforeheading + $x$ & $R(x)$ & $S(x)$ \\ \afterheading + $1\times 10^2$ & $-5.20619$ & $3.29208$ \\\normalline + $1\times 10^3$ & $-5.02006$ & $3.47902$ \\\normalline + $1\times 10^4$ & $-5.00200$ & $3.49790$ \\\normalline + $1\times 10^5$ & $-5.00020$ & $3.49979$ \\\normalline + $1\times 10^6$ & $-5.00002$ & $3.49998$ \\\lastline + \end{tabular} + \end{minipage}% + \begin{minipage}{.5\textwidth} + \centering + \caption{$R$ and $S$ as $x\rightarrow-\infty$} + \label{rat:tab:minusinfty} + \begin{tabular}{crr} + \beforeheading + $x$ & $R(x)$ & $S(x)$ \\ \afterheading + $-1\times 10^2$ & $-4.80583$ & $3.71212$ \\\normalline + $-1\times 10^3$ & $-4.98006$ & $3.52102$ \\\normalline + $-1\times 10^4$ & $-4.99800$ & $3.50210$ \\\normalline + $-1\times 10^5$ & $-4.99980$ & $3.50021$ \\\normalline + $-1\times 10^6$ & $-4.99998$ & $3.50002$ \\\lastline + \end{tabular} + \end{minipage} +\end{table} + +Xiao and Dwayne study \cref{rat:tab:plusinfty,rat:tab:minusinfty} and decide that +the functions $R$ and $S$ never actually touch their horizontal asymptotes, but they +do get infinitely close. They also feel as if they have a better understanding of +what it means to study the behavior of a function as $x\rightarrow\pm\infty$. +\end{pccexample} + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{pccexample}[Repeated factors in the numerator] +Consider the functions $f$, $g$, and $h$ that have formulas +\[ + f(x)=\frac{(x-2)^2}{(x-3)(x+1)}, \qquad g(x)=\frac{x-2}{(x-3)(x+1)}, \qquad h(x)=\frac{(x-2)^3}{(x-3)(x+1)} +\] +which are graphed in \cref{rat:fig:repfactn}. We note that each function has vertical +asymptotes at $-1$ and $3$, and so the domain of each function is +\[ + (-\infty,-1)\cup(-1,3)\cup(3,\infty) +\] +We also notice that the numerators of each function are quite similar| indeed, each +function has a zero at $2$, but how does each function behave around their zero? + +Using \cref{rat:fig:repfactn} to guide us, we note that +\begin{itemize} + \item $f$ has a horizontal intercept $(2,0)$, but the curve of + $f$ does not cut the horizontal axis| it bounces off it; + \item $g$ also has a horizontal intercept $(2,0)$, and the curve + of $g$ \emph{does} cut the horizontal axis; + \item $h$ has a horizontal intercept $(2,0)$, and the curve of $h$ + also cuts the axis, but appears flattened as it does so. +\end{itemize} + +We can further enrich our study by discussing the long-run behavior of each function. +Using the tools of \cref{rat:def:longrun}, we can deduce that +\begin{itemize} + \item $f$ has a horizontal asymptote with equation $y=1$; + \item $g$ has a horizontal asymptote with equation $y=0$; + \item $h$ does \emph{not} have a horizontal asymptote| it has an oblique asymptote (we'll + study this more in \cref{rat:sec:oblique}). +\end{itemize} +\end{pccexample} + +\begin{figure}[!htb] + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x-2)^2/((x+1)*(x-3));}] + \begin{axis}[ + % framed, + xmin=-5,xmax=5, + ymin=-10,ymax=10, + xtick={-4,-2,...,4}, + ytick={-8,-4,...,8}, + % grid=both, + width=\figurewidth, + ] + \addplot[pccplot] expression[domain=-5:-1.248,samples=50]{f}; + \addplot[pccplot] expression[domain=-0.794:2.976,samples=50]{f}; + \addplot[pccplot] expression[domain=3.026:5,samples=50]{f}; + \addplot[soldot] coordinates{(2,0)}; + % \addplot[asymptote,domain=-6:6]({-1},{x}); + % \addplot[asymptote,domain=-6:6]({3},{x}); + \end{axis} + \end{tikzpicture} + \caption{$y=\dfrac{(x-2)^2}{(x+1)(x-3)}$} + \label{rat:fig:repfactn1} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x-2)/((x+1)*(x-3));}] + \begin{axis}[ + % framed, + xmin=-5,xmax=5, + ymin=-10,ymax=10, + xtick={-4,-2,...,4}, + ytick={-8,-4,...,8}, + % grid=both, + width=\figurewidth, + ] + \addplot[pccplot] expression[domain=-5:-1.075]{f}; + \addplot[pccplot] expression[domain=-0.925:2.975]{f}; + \addplot[pccplot] expression[domain=3.025:5]{f}; + \addplot[soldot] coordinates{(2,0)}; + % \addplot[asymptote,domain=-6:6]({-1},{x}); + % \addplot[asymptote,domain=-6:6]({3},{x}); + \end{axis} + \end{tikzpicture} + \caption{$y=\dfrac{x-2}{(x+1)(x-3)}$} + \label{rat:fig:repfactn2} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x-2)^3/((x+1)*(x-3));}] + \begin{axis}[ + % framed, + xmin=-5,xmax=5, + xtick={-8,-6,...,8}, + % grid=both, + ymin=-30,ymax=30, + width=\figurewidth, + ] + \addplot[pccplot] expression[domain=-5:-1.27]{f}; + \addplot[pccplot] expression[domain=-0.806:2.99185]{f}; + \addplot[pccplot] expression[domain=3.0085:5]{f}; + \addplot[soldot] coordinates{(2,0)}; + % \addplot[asymptote,domain=-30:30]({-1},{x}); + % \addplot[asymptote,domain=-30:30]({3},{x}); + \end{axis} + \end{tikzpicture} + \caption{$y=\dfrac{(x-2)^3}{(x+1)(x-3)}$} + \label{rat:fig:repfactn3} + \end{subfigure} + \caption{} + \label{rat:fig:repfactn} +\end{figure} + +\subsection*{Holes} +Rational functions have a vertical asymptote at $a$ if the denominator is $0$ at $a$. +What happens if the numerator is $0$ at the same place? In this case, we say that the rational +function has a \emph{hole} at $a$. +\begin{pccdefinition}[Holes] +The rational function +\[ + r(x)=\frac{p(x)}{q(x)} +\] +has a hole at $a$ if $p(a)=q(a)=0$. Note that holes are different from +a vertical asymptotes. We represent that $r$ has a hole at the point +$(a,r(a))$ on the curve $y=r(x)$ by +using a hollow circle, $\circ$. +\end{pccdefinition} + +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{pccexample} +\pccname{Mohammed} and \pccname{Sue} have graphed the function $r$ that has formula +\[ + r(x)=\frac{x^2+x-6}{(x-2)} +\] +in their calculators, and can not decide if the correct graph +is \cref{rat:fig:hole} or \cref{rat:fig:hole1}. + +Luckily for them, Oscar is nearby, and can help them settle the debate. +Oscar demonstrates that +\begin{align*} + r(x) & =\frac{(x+3)(x-2)}{(x-2)} \\ + & = x+3 +\end{align*} +but only when $x\ne 2$, because the function is undefined at $2$. Oscar +says that this necessarily means that the domain or $r$ is +\[ + (-\infty,2)\cup(2,\infty) +\] +and that $r$ must have a hole at $2$. + +Mohammed and Sue are very grateful for the clarification, and conclude that +the graph of $r$ is shown in \cref{rat:fig:hole1}. +\begin{figure}[!htb] + \begin{minipage}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-4,...,8}, + ytick={-8,-4,...,8}, + grid=both, + width=\textwidth, + ] + \addplot expression[domain=-10:7]{x+3}; + \addplot[soldot] coordinates{(-3,0)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:hole} + \end{minipage}% + \hfill + \begin{minipage}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-4,...,8}, + ytick={-8,-4,...,8}, + grid=both, + width=\textwidth, + ] + \addplot expression[domain=-10:7]{x+3}; + \addplot[holdot] coordinates{(2,5)}; + \addplot[soldot] coordinates{(-3,0)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:hole1} + \end{minipage}% +\end{figure} +\end{pccexample} + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{pccexample} +Consider the function $f$ that has formula +\[ + f(x)=\frac{x(x+3)}{x^2-4x} +\] +The domain of $f$ is $(-\infty,0)\cup(0,4)\cup(4,\infty)$ because both $0$ and $4$ +make the denominator equal to $0$. Notice that +\begin{align*} + f(x) & = \frac{x(x+3)}{x(x-4)} \\ + & = \frac{x+3}{x-4} +\end{align*} +provided that $x\ne 0$. Since $0$ makes the numerator +and the denominator 0 at the same time, we say that $f$ has a hole at $(0,-\nicefrac{3}{4})$. +Note that this necessarily means that $f$ does not have a vertical intercept. + +We also note $f$ has a vertical asymptote at $4$; the function is graphed in \cref{rat:fig:holeex}. +\begin{figure}[!htb] + \centering + \begin{tikzpicture}[/pgf/declare function={f=(x+3)/(x-4);}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-8,-6,...,8}, + grid=both, + ] + \addplot[pccplot] expression[domain=-10:3.36364,samples=50]{f}; + \addplot[pccplot] expression[domain=4.77:10]{f}; + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[holdot]coordinates{(0,-0.75)}; + \addplot[soldot] coordinates{(-3,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=\dfrac{x(x+3)}{x^2-4x}$} + \label{rat:fig:holeex} +\end{figure} +\end{pccexample} + + + +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{pccexample}[Minimums and maximums] +\pccname{Seamus} and \pccname{Trang} are discussing rational functions. Seamus says that +if a rational function has a vertical asymptote, then it can +not possibly have local minimums and maximums, nor can it have +global minimums and maximums. + +Trang says this statement is not always true. She plots the functions +$f$ and $g$ that have formulas +\[ + f(x)=-\frac{32(x-1)(x+1)}{(x-2)^2(x+2)^2}, \qquad g(x)=\frac{32(x-1)(x+1)}{(x-2)^2(x+2)^2} +\] +in \cref{rat:fig:minmax1,rat:fig:minmax2} and shows them to Seamus. On seeing the graphs, +Seamus quickly corrects himself, and says that $f$ has a local (and global) +maximum of $2$ at $0$, and that $g$ has a local (and global) minimum of $-2$ at $0$. + +\begin{figure}[!htb] + \begin{minipage}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=-32*(x-1)*(x+1)/(( x-2)^2*(x+2)^2);}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-8,-6,...,8}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:-3.01]{f}; + \addplot[pccplot] expression[domain=-1.45:1.45]{f}; + \addplot[pccplot] expression[domain=3.01:10]{f}; + \addplot[soldot] coordinates{(-1,0)(1,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=f(x)$} + \label{rat:fig:minmax1} + \end{minipage}% + \hfill + \begin{minipage}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=32*(x-1)*(x+1)/(( x-2)^2*(x+2)^2);}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-8,-6,...,8}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:-3.01]{f}; + \addplot[pccplot] expression[domain=-1.45:1.45]{f}; + \addplot[pccplot] expression[domain=3.01:10]{f}; + \addplot[soldot] coordinates{(-1,0)(1,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=g(x)$} + \label{rat:fig:minmax2} + \end{minipage}% +\end{figure} + +Seamus also notes that (in its domain) the function $f$ is always concave down, and +that (in its domain) the function $g$ is always concave up. Furthermore, Trang +observes that each function behaves like $\frac{1}{x^2}$ around each of its vertical +asymptotes, because each linear factor in the denominator is raised to the power $2$. + +\pccname{Oscar} stops by and reminds both students about the long-run behavior; according +to \cref{rat:def:longrun} since the degree of the denominator is greater than the +degree of the numerator (in both functions), each function has a horizontal asymptote +at $y=0$. +\end{pccexample} + + +\investigation*{} +%=================================== +% Author: Pettit/Hughes +% Date: March 2012 +%=================================== +\begin{problem}[The spaghetti incident] +The same Queen from \vref{exp:prob:queenschessboard} has recovered from +the rice experiments, and has called her loyal jester for another challenge. + +The jester has an $11-$inch piece of uncooked spaghetti that he puts on a table; +he uses a book to cover $\unit[1]{inch}$ of it so that +$\unit[10]{inches}$ hang over the edge. The jester then produces a box of $\unit{mg}$ +weights that can be hung from the spaghetti. + +The jester says it will take $\unit[y]{mg}$ to break the spaghetti when hung +$\unit[x]{inches}$ from the edge, according to the rule $y=\frac{100}{x}$. +\begin{margintable} + \centering + \captionof{table}{} + \label{rat:tab:spaghetti} + \begin{tabular}{cc} + \beforeheading + \heading{$x$} & \heading{$y$} \\ + \afterheading + $1$ & \\\normalline + $2$ & \\\normalline + $3$ & \\\normalline + $4$ & \\\normalline + $5$ & \\\normalline + $6$ & \\\normalline + $7$ & \\\normalline + $8$ & \\\normalline + $9$ & \\\normalline + $10$ & \\\lastline + \end{tabular} +\end{margintable} +\begin{subproblem}\label{rat:prob:spaggt1} + Help the Queen complete \cref{rat:tab:spaghetti}, and use $2$ digits after the decimal + where appropriate. + \begin{shortsolution} + \begin{tabular}[t]{ld{2}} + \beforeheading + \heading{$x$} & \heading{$y$} \\ + \afterheading + $1$ & 100 \\\normalline + $2$ & 50 \\\normalline + $3$ & 33.33 \\\normalline + $4$ & 25 \\\normalline + $5$ & 20 \\\normalline + $6$ & 16.67 \\\normalline + $7$ & 14.29 \\\normalline + $8$ & 12.50 \\\normalline + $9$ & 11.11 \\\normalline + $10$ & 10 \\\lastline + \end{tabular} + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + What do you notice about the number of $\unit{mg}$ that it takes to break + the spaghetti as $x$ increases? + \begin{shortsolution} + It seems that the number of $\unit{mg}$ that it takes to break the spaghetti decreases + as $x$ increases. + \end{shortsolution} +\end{subproblem} +\begin{subproblem}\label{rat:prob:spaglt1} + The Queen wonders what happens when $x$ gets very small| help the Queen construct + a table of values for $x$ and $y$ when $x=0.0001, 0.001, 0.01, 0.1, 0.5, 1$. + \begin{shortsolution} + \begin{tabular}[t]{d{2}l} + \beforeheading + \heading{$x$} & \heading{$y$} \\ + \afterheading + 0.0001 & $1000000$ \\\normalline + 0.001 & $100000$ \\\normalline + 0.01 & $10000$ \\\normalline + 0.1 & $1000$ \\\normalline + 0.5 & $200$ \\\normalline + 1 & $100$ \\\lastline + \end{tabular} + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + What do you notice about the number of $\unit{mg}$ that it takes to break the spaghetti + as $x\rightarrow 0$? Would it ever make sense to let $x=0$? + \begin{shortsolution} + The number of $\unit{mg}$ required to break the spaghetti increases as $x\rightarrow 0$. + We can not allow $x$ to be $0$, as we can not divide by $0$, and we can not + be $0$ inches from the edge of the table. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Plot your results from \cref{rat:prob:spaggt1,rat:prob:spaglt1} on the same graph, + and join the points using a smooth curve| set the maximum value of $y$ as $200$, and + note that this necessarily means that you will not be able to plot all of the points. + \begin{shortsolution} + The graph of $y=\frac{100}{x}$ is shown below. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-2,xmax=11, + ymin=-20,ymax=200, + xtick={2,4,...,10}, + ytick={20,40,...,180}, + grid=major, + width=\solutionfigurewidth, + ] + \addplot+[-] expression[domain=0.5:10]{100/x}; + \addplot[soldot] coordinates{(0.5,200)(1,100)(2,50)(3,33.33) + (4,25)(5,20)(16.67)(7,14.29)(8,12.50)(9,11.11)(10,10)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Using your graph, observe what happens to $y$ as $x$ increases. If we could somehow + construct a piece of uncooked spaghetti that was $\unit[101]{inches}$ long, how many + $\unit{mg}$ would it take to break the spaghetti? + \begin{shortsolution} + As $x$ increases, $y\rightarrow 0$. If we could construct a piece of spaghetti + $\unit[101]{inches}$ long, it would only take $\unit[1]{mg}$ to break it $\left(\frac{100}{100}=1\right)$. Of course, + the weight of spaghetti would probably cause it to break without the weight. + \end{shortsolution} +\end{subproblem} +The Queen looks forward to more food-related investigations from her jester. +\end{problem} + + + +%=================================== +% Author: Adams (Hughes) +% Date: March 2012 +%=================================== +\begin{problem}[Debt Amortization] +To amortize a debt means to pay it off in a given length of time using +equal periodic payments. The payments include interest on the unpaid +balance. The following formula gives the monthly payment, $M$, in dollars +that is necessary to amortize a debt of $P$ dollars in $n$ months +at a monthly interest rate of $i$ +\[ + M=\frac{P\cdot i}{1-(1+i)^{-n}} +\] +Use this formula in each of the following problems. +\begin{subproblem} + What monthly payments are necessary on a credit card debt of \$2000 at + $\unit[1.5]{\%}$ monthly if you want to pay off the debt in $2$ years? + In one year? How much money will you save by paying off the debt in the + shorter amount of time? + \begin{shortsolution} + Paying off the debt in $2$ years, we use + \begin{align*} + M & = \frac{2000\cdot 0.015}{1-(1+0.015)^{-24}} \\ + & \approx 99.85 + \end{align*} + The monthly payments are \$99.85. + + Paying off the debt in $1$ year, we use + \begin{align*} + M & = \frac{2000\cdot 0.015}{1-(1+0.015)^{-12}} \\ + & \approx 183.36 + \end{align*} + The monthly payments are \$183.36 + + In the $2$-year model we would pay a total of $\$99.85\cdot 12=\$2396.40$. In the + $1$-year model we would pay a total of $\$183.36\cdot 12=\$2200.32$. We would therefore + save $\$196.08$ if we went with the $1$-year model instead of the $2$-year model. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + To purchase a home, a family needs a loan of \$300,000 at $\unit[5.2]{\%}$ + annual interest. Compare a $20$ year loan to a $30$ year loan and make + a recommendation for the family. + (Note: when given an annual interest rate, it is a common business practice to divide by + $12$ to get a monthly rate.) + \begin{shortsolution} + For the $20$-year loan we use + \begin{align*} + M & = \frac{300000\cdot \frac{0.052}{12}}{1-\left( 1+\frac{0.052}{12} \right)^{-12\cdot 20}} \\ + & \approx 2013.16 + \end{align*} + The monthly payments are \$2013.16. + + For the $30$-year loan we use + \begin{align*} + M & = \frac{300000\cdot \frac{0.052}{12}}{1-\left( 1+\frac{0.052}{12} \right)^{-12\cdot 30}} \\ + & \approx 1647.33 + \end{align*} + The monthly payments are \$1647.33. + + The total amount paid during the $20$-year loan is $\$2013.16\cdot 12\cdot 20=\$483,158.40$. + The total amount paid during the $30$-year loan is $\$1647.33\cdot 12\cdot 30=\$593,038.80$. + + Recommendation: if you can afford the payments, choose the $20$-year loan. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + \pccname{Ellen} wants to make monthly payments of \$100 to pay off a debt of \$3000 + at \unit[12]{\%} annual interest. How long will it take her to pay off the + debt? + \begin{shortsolution} + We are given $M=100$, $P=3000$, $i=0.01$, and we need to find $n$ + in the equation + \[ + 100 = \frac{3000\cdot 0.01}{1-(1+0.01)^{-n}} + \] + Using logarithms, we find that $n\approx 36$. It will take + Ellen about $3$ years to pay off the debt. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + \pccname{Jake} is going to buy a new car. He puts \$2000 down and wants to finance the + remaining \$14,000. The dealer will offer him \unit[4]{\%} annual interest for + $5$ years, or a \$2000 + rebate which he can use to reduce the amount of the loan and \unit[8]{\%} + annual interest for 5 years. Which should he choose? + \begin{shortsolution} + \begin{description} + \item[Option 1:] $\unit[4]{\%}$ annual interest for $5$ years on \$14,000. + This means that the monthly payments will be calculated using + \begin{align*} + M & = \frac{14000\cdot \frac{0.04}{12}}{1-\left( 1+\frac{0.04}{12} \right)^{-12\cdot 5}} \\ + & \approx 257.83 + \end{align*} + The monthly payments will be $\$257.83$. The total amount paid will be + $\$257.83\cdot 5\cdot 12=\$15,469.80$, of which $\$1469.80$ is interest. + \item[Option 2:] $\unit[8]{\%}$ annual interest for $5$ years on \$12,000. + This means that the monthly payments will be calculated using + \begin{align*} + M & = \frac{12000\cdot \frac{0.08}{12}}{1-\left( 1+\frac{0.08}{12} \right)^{-12\cdot 5}} \\ + & \approx 243.32 + \end{align*} + The monthly payments will be $\$243.32$. The total amount paid + will be $\$243.32\cdot 5\cdot 12 =\$14,599.20$, of which $\$2599.2$ is + interest. + \end{description} + Jake should choose option 1 to minimize the amount of interest + he has to pay. + \end{shortsolution} +\end{subproblem} +\end{problem} + +\begin{exercises} +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{problem}[Rational or not] +Decide if each of the following functions are rational or not. If +they are rational, state their domain. +\begin{multicols}{3} + \begin{subproblem} + $r(x)=\dfrac{3}{x}$ + \begin{shortsolution} + $r$ is rational; the domain of $r$ is $(-\infty,0)\cup (0,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $s(y)=\dfrac{y}{6}$ + \begin{shortsolution} + $s$ is not rational ($s$ is linear). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $t(z)=\dfrac{4-x}{7-8z}$ + \begin{shortsolution} + $t$ is rational; the domain of $t$ is $\left( -\infty,\dfrac{7}{8} \right)\cup \left( \dfrac{7}{8},\infty \right)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $u(w)=\dfrac{w^2}{(w-3)(w+4)}$ + \begin{shortsolution} + $u$ is rational; the domain of $w$ is $(-\infty,-4)\cup(-4,3)\cup(3,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $v(x)=\dfrac{4}{(x-2)^2}$ + \begin{shortsolution} + $v$ is rational; the domain of $v$ is $(-\infty,2)\cup(2,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $w(x)=\dfrac{9-x}{x+17}$ + \begin{shortsolution} + $w$ is rational; the domain of $w$ is $(-\infty,-17)\cup(-17,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $a(x)=x^2+4$ + \begin{shortsolution} + $a$ is not rational ($a$ is quadratic, or a polynomial of degree $2$). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $b(y)=3^y$ + \begin{shortsolution} + $b$ is not rational ($b$ is exponential). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $c(z)=\dfrac{z^2}{z^3}$ + \begin{shortsolution} + $c$ is rational; the domain of $c$ is $(-\infty,0)\cup (0,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $d(x)=x^2(x+3)(5x-7)$ + \begin{shortsolution} + $d$ is not rational ($d$ is a polynomial). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $e(\alpha)=\dfrac{\alpha^2}{\alpha^2-1}$ + \begin{shortsolution} + $e$ is rational; the domain of $e$ is $(-\infty,-1)\cup(-1,1)\cup(1,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $f(\beta)=\dfrac{3}{4}$ + \begin{shortsolution} + $f$ is not rational ($f$ is constant). + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{problem}[Function evaluation] +Let $r$ be the function that has formula +\[ + r(x)=\frac{(x-2)(x+3)}{(x+5)(x-7)} +\] +Evaluate each of the following (if possible); if the value is undefined, +then state so. +\begin{multicols}{4} + \begin{subproblem} + $r(0)$ + \begin{shortsolution} + $\begin{aligned}[t] + r(0)&=\frac{(0-2)(0+3)}{(0+5)(0-7)}\\ + &=\frac{-6}{-35}\\ + &=\frac{6}{35} + \end{aligned}$ + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + $r(1)$ + \begin{shortsolution} + $\begin{aligned}[t] + r(1)&=\frac{(1-2)(1+3)}{(1+5)(1-7)}\\ + &=\frac{-4}{-36}\\ + &=\frac{1}{9} + \end{aligned}$ +\end{shortsolution} +\end{subproblem} +\begin{subproblem} + $r(2)$ + \begin{shortsolution} + $\begin{aligned}[t] + r(2)&=\frac{(2-2)(2+3)}{(2+5)(2-7)}\\ + & = \frac{0}{-50}\\ + &=0 + \end{aligned}$ +\end{shortsolution} +\end{subproblem} +\begin{subproblem} + $r(4)$ + \begin{shortsolution} + $\begin{aligned}[t] + r(4)&=\frac{(4-2)(4+3)}{(4+5)(4-7)}\\ + &=\frac{14}{-27}\\ + &=-\frac{14}{27} + \end{aligned}$ +\end{shortsolution} +\end{subproblem} +\begin{subproblem} + $r(7)$ + \begin{shortsolution} + $\begin{aligned}[t] + r(7)&=\frac{(7-2)(7+3)}{(7+5)(7-7)}\\ + & =\frac{50}{0} + \end{aligned}$ + + $r(7)$ is undefined. +\end{shortsolution} +\end{subproblem} +\begin{subproblem} + $r(-3)$ + \begin{shortsolution} + $\begin{aligned}[t] + r(-3)&=\frac{(-3-2)(-3+3)}{(-3+5)(-3-7)}\\ + &=\frac{0}{-20}\\ + &=0 + \end{aligned}$ +\end{shortsolution} +\end{subproblem} +\begin{subproblem} + $r(-5)$ + \begin{shortsolution} + $\begin{aligned}[t] + r(-5)&=\frac{(-5-2)(-5+3)}{(-5+5)(-5-7)}\\ + &=\frac{14}{0} + \end{aligned}$ + + $r(-5)$ is undefined. +\end{shortsolution} +\end{subproblem} +\begin{subproblem} + $r\left( \frac{1}{2} \right)$ + \begin{shortsolution} + $\begin{aligned}[t] + r\left( \frac{1}{2} \right)& = \frac{\left( \frac{1}{2}-2 \right)\left( \frac{1}{2}+3 \right)}{\left( \frac{1}{2}+5 \right)\left( \frac{1}{2}-7 \right)}\\ + &=\frac{-\frac{3}{2}\cdot\frac{7}{2}}{\frac{11}{2}\left( -\frac{13}{2} \right)}\\ + &=\frac{-\frac{21}{4}}{-\frac{143}{4}}\\ + &=\frac{37}{143} + \end{aligned}$ +\end{shortsolution} +\end{subproblem} +\end{multicols} +\end{problem} +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{problem}[Holes or asymptotes?] +State the domain of each of the following rational functions. Identify +any holes or asymptotes. +\begin{multicols}{3} + \begin{subproblem} + $f(x)=\dfrac{12}{x-2}$ + \begin{shortsolution} + $f$ has a vertical asymptote at $2$; the domain of $f$ is $(-\infty,2)\cup (2,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $g(x)=\dfrac{x^2+x}{(x+1)(x-2)}$ + \begin{shortsolution} + $g$ has a vertical asymptote at $2$, and a hole at $-1$; the domain of $g$ is $(-\infty,-1)\cup(-1,2)\cup(2,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $h(x)=\dfrac{x^2+5x+4}{x^2+x-12}$ + \begin{shortsolution} + $h$ has a vertical asymptote at $3$, and a whole at $-4$; the domain of $h$ is $(-\infty,-4)\cup(-4,3)\cup(3,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $k(z)=\dfrac{z+2}{2z-3}$ + \begin{shortsolution} + $k$ has a vertical asymptote at $\dfrac{3}{2}$; the domain of $k$ is $\left( -\infty,\dfrac{3}{2} \right)\cup\left( \dfrac{3}{2},\infty \right)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $l(w)=\dfrac{w}{w^2+1}$ + \begin{shortsolution} + $l$ does not have any vertical asymptotes nor holes; the domain of $w$ is $(-\infty,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $m(t)=\dfrac{14}{13-t^2}$ + \begin{shortsolution} + $m$ has vertical asymptotes at $\pm\sqrt{13}$; the domain of $m$ is $(-\infty,\sqrt{13})\cup(-\sqrt{13},\sqrt{13})\cup(\sqrt{13},\infty)$. + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{problem}[Find a formula from a graph] +Consider the rational functions graphed in \cref{rat:fig:findformula}. Find +the vertical asymptotes for each function, together with any zeros, and +give a possible formula for each. +\begin{shortsolution} + \begin{itemize} + \item \Vref{rat:fig:formula1}: possible formula is $r(x)=\dfrac{1}{x+5}$ + \item \Vref{rat:fig:formula2}: possible formula is $r(x)=\dfrac{(x+3)}{(x-5)}$ + \item \Vref{rat:fig:formula3}: possible formula is $r(x)=\dfrac{1}{(x-4)(x+3)}$. + \end{itemize} +\end{shortsolution} +\end{problem} + +\begin{figure}[!htb] + \begin{widepage} + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=1/(x+4);}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-6,ymax=6, + xtick={-8,-6,...,8}, + minor ytick={-4,-3,...,4}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:-4.16667,samples=50]{f}; + \addplot[pccplot] expression[domain=-3.83333:10,samples=50]{f}; + \addplot[asymptote,domain=-6:6]({-4},{x}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:formula1} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x+3)/(x-5);}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-6,ymax=6, + xtick={-8,-6,...,8}, + minor ytick={-4,-3,...,4}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:3.85714]{f}; + \addplot[pccplot] expression[domain=6.6:10]{f}; + \addplot[soldot] coordinates{(-3,0)}; + \addplot[asymptote,domain=-6:6]({5},{x}); + \addplot[asymptote,domain=-10:10]({x},{1}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:formula2} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=1/((x-4)*(x+3));}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-3,ymax=3, + xtick={-8,-6,...,8}, + minor ytick={-4,-3,...,4}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:-3.0473]{f}; + \addplot[pccplot] expression[domain=-2.95205:3.95205]{f}; + \addplot[pccplot] expression[domain=4.0473:10]{f}; + \addplot[asymptote,domain=-3:3]({-3},{x}); + \addplot[asymptote,domain=-3:3]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{0}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:formula3} + \end{subfigure} + \caption{} + \label{rat:fig:findformula} + \end{widepage} +\end{figure} + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{problem}[Find a formula from a description] +In each of the following problems, give a formula of a rational +function that has the listed properties. +\begin{subproblem} + Vertical asymptote at $2$. + \begin{shortsolution} + Possible option: $r(x)=\dfrac{1}{x-2}$. Note that we could multiply the + numerator or denominator by any real number and still have the desired properties. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Vertical asymptote at $5$. + \begin{shortsolution} + Possible option: $r(x)=\dfrac{1}{x-5}$. Note that we could multiply the + numerator or denominator by any real number and still have the desired properties. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Vertical asymptote at $-2$, and zero at $6$. + \begin{shortsolution} + Possible option: $r(x)=\dfrac{x-6}{x+2}$. Note that we could multiply the + numerator or denominator by any real number and still have the desired properties. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Zeros at $2$ and $-5$ and vertical asymptotes at $1$ and $-7$. + \begin{shortsolution} + Possible option: $r(x)=\dfrac{(x-2)(x+5)}{(x-1)(x+7)}$. Note that we could multiply the + numerator or denominator by any real number and still have the desired properties. + \end{shortsolution} +\end{subproblem} +\end{problem} + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{problem}[Given formula, find horizontal asymptotes] +Each of the following functions has a horizontal asymptote. Write the equation +of the horizontal asymptote for each function. +\begin{multicols}{3} + \begin{subproblem} + $f(x) = \dfrac{1}{x}$ + \begin{shortsolution} + $y=0$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $g(x) = \dfrac{2x+3}{x}$ + \begin{shortsolution} + $y=2$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $h(x) = \dfrac{x^2+2x}{x^2+3}$ + \begin{shortsolution} + $y=1$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $k(x) = \dfrac{x^2+7}{x}$ + \begin{shortsolution} + $y=1$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $l(x)=\dfrac{3x-2}{5x+8}$ + \begin{shortsolution} + $y=\dfrac{3}{5}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $m(x)=\dfrac{3x-2}{5x^2+8}$ + \begin{shortsolution} + $y=0$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $n(x)=\dfrac{(6x+1)(x-7)}{(11x-8)(x-5)}$ + \begin{shortsolution} + $y=\dfrac{6}{11}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=\dfrac{19x^3}{5-x^4}$ + \begin{shortsolution} + $y=0$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $q(x)=\dfrac{14x^2+x}{1-7x^2}$ + \begin{shortsolution} + $y=-2$ + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} + +%=================================== +% Author: Hughes +% Date: May 2012 +%=================================== +\begin{problem}[Given horizontal asymptotes, find formula] +In each of the following problems, give a formula for a function that +has the given horizontal asymptote. Note that there may be more than one option. +\begin{multicols}{4} + \begin{subproblem} + $y=7$ + \begin{shortsolution} + Possible option: $f(x)=\dfrac{7(x-2)}{x+1}$. Note that there + are other options, provided that the degree of the numerator is the same as the degree + of the denominator, and that the ratio of the leading + coefficients is $7$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=-1$ + \begin{shortsolution} + Possible option: $f(x)=\dfrac{5-x^2}{x^2+10}$. Note that there + are other options, provided that the degree of the numerator is the same as the degree + of the denominator, and that the ratio of the leading + coefficients is $10$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=53$ + \begin{shortsolution} + Possible option: $f(x)=\dfrac{53x^3}{x^3+4x^2-7}$. Note that there + are other options, provided that the degree of the numerator is the same as the degree + of the denominator, and that the ratio of the leading + coefficients is $53$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=-17$ + \begin{shortsolution} + Possible option: $f(x)=\dfrac{34(x+2)}{7-2x}$. Note that there + are other options, provided that the degree of the numerator is the same as the degree + of the denominator, and that the ratio of the leading + coefficients is $-17$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=\dfrac{3}{2}$ + \begin{shortsolution} + Possible option: $f(x)=\dfrac{3x+4}{2(x+1)}$. Note that there + are other options, provided that the degree of the numerator is the same as the degree + of the denominator, and that the ratio of the leading + coefficients is $\dfrac{3}{2}$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=0$ + \begin{shortsolution} + Possible option: $f(x)=\dfrac{4}{x}$. Note that there + are other options, provided that the degree of the numerator is less than the degree + of the denominator. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=-1$ + \begin{shortsolution} + Possible option: $f(x)=\dfrac{10x}{5-10x}$. Note that there + are other options, provided that the degree of the numerator is the same as the degree + of the denominator, and that the ratio of the leading + coefficients is $-1$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=2$ + \begin{shortsolution} + Possible option: $f(x)=\dfrac{8x-3}{4x+1}$. Note that there + are other options, provided that the degree of the numerator is the same as the degree + of the denominator, and that the ratio of the leading + coefficients is $2$. + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{problem}[Find a formula from a description] +In each of the following problems, give a formula for a function that +has the prescribed properties. Note that there may be more than one option. +\begin{subproblem} + $f(x)\rightarrow 3$ as $x\rightarrow\pm\infty$. + \begin{shortsolution} + Possible option: $f(x)=\dfrac{3(x-2)}{x+7}$. Note that + the zero and asymptote of $f$ could be changed, and $f$ would still have the desired properties. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + $r(x)\rightarrow -4$ as $x\rightarrow\pm\infty$. + \begin{shortsolution} + Possible option: $r(x)=\dfrac{-4(x-2)}{x+7}$. Note that + the zero and asymptote of $r$ could be changed, and $r$ would still have the desired properties. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + $k(x)\rightarrow 2$ as $x\rightarrow\pm\infty$, and $k$ has vertical asymptotes at $-3$ and $5$. + \begin{shortsolution} + Possible option: $k(x)=\dfrac{2x^2}{(x+3)(x-5)}$. Note that the denominator + must have the given factors; the numerator could be any degree $2$ polynomial, provided the + leading coefficient is $2$. + \end{shortsolution} +\end{subproblem} +\end{problem} + +%=================================== +% Author: Hughes +% Date: Feb 2011 +%=================================== +\begin{problem} +Let $r$ be the rational function that has +\[ + r(x) = \frac{(x+2)(x-1)}{(x+3)(x-4)} +\] +Each of the following questions are in relation to this function. +\begin{subproblem} + What is the vertical intercept of this function? State your answer as an + ordered pair. \index{rational functions!vertical intercept} + \begin{shortsolution} + $\left(0,\frac{1}{6}\right)$ + \end{shortsolution} +\end{subproblem} +\begin{subproblem}\label{rat:prob:rational} + What values of $x$ make the denominator equal to $0$? + \begin{shortsolution} + $-3,4$ + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Use your answer to \cref{rat:prob:rational} to write the domain of the function in + both interval, and set builder notation. %\index{rational functions!domain}\index{domain!rational functions} + \begin{shortsolution} + Interval notation: $(-\infty,-3)\cup (-3,4)\cup (4,\infty)$. + Set builder: $\{x|x\ne -3, \mathrm{and}\, x\ne 4\}$ + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + What are the vertical asymptotes of the function? State your answers in + the form $x=$ + \begin{shortsolution} + $x=-3$ and $x=4$ + \end{shortsolution} +\end{subproblem} +\begin{subproblem}\label{rat:prob:zeroes} + What values of $x$ make the numerator equal to $0$? + \begin{shortsolution} + $-2,1$ + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Use your answer to \cref{rat:prob:zeroes} to write the horizontal intercepts of + $r$ as ordered pairs. + \begin{shortsolution} + $(-2,0)$ and $(1,0)$ + \end{shortsolution} +\end{subproblem} +\end{problem} + + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{problem}[Holes] +\pccname{Josh} and \pccname{Pedro} are discussing the function +\[ + r(x)=\frac{x^2-1}{(x+3)(x-1)} +\] +\begin{subproblem} + What is the domain of $r$? + \begin{shortsolution} + The domain of $r$ is $(-\infty,-3)\cup(-3,1)\cup(1,\infty)$. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Josh notices that the numerator can be factored- can you see how? + \begin{shortsolution} + $(x^2-1)=(x-1)(x+1)$ + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Pedro asks, `Doesn't that just mean that + \[ + r(x)=\frac{x+1}{x+3} + \] + for all values of $x$?' Josh says, `Nearly\ldots but not for all values of $x$'. + What does Josh mean? + \begin{shortsolution} + $r(x)=\dfrac{x+1}{x+3}$ provided that $x\ne -1$. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Where does $r$ have vertical asymptotes, and where does it have holes? + \begin{shortsolution} + The function $r$ has a vertical asymptote at $-3$, and a hole at $1$. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Sketch a graph of $r$. + \begin{shortsolution} + A graph of $r$ is shown below. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-8,-6,...,8}, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot] expression[domain=-10:-3.25]{(x+1)/(x+3)}; + \addplot[pccplot] expression[domain=-2.75:10]{(x+1)/(x+3)}; + \addplot[asymptote,domain=-10:10]({-3},{x}); + \addplot[holdot]coordinates{(1,0.5)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} +\end{subproblem} +\end{problem} + +%=================================== +% Author: Hughes +% Date: July 2012 +%=================================== +\begin{problem}[Function algebra] +Let $r$ and $s$ be the rational functions that have formulas +\[ + r(x)=\frac{2-x}{x+3}, \qquad s(x)=\frac{x^2}{x-4} +\] +Evaluate each of the following (if possible). +\begin{multicols}{4} + \begin{subproblem} + $(r+s)(5)$ + \begin{shortsolution} + $\frac{197}{8}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(r-s)(3)$ + \begin{shortsolution} + $\frac{53}{6}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(r\cdot s)(4)$ + \begin{shortsolution} + Undefined. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $\left( \frac{r}{s} \right)(1)$ + \begin{shortsolution} + $-\frac{3}{4}$ + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} + + +%=================================== +% Author: Hughes +% Date: July 2012 +%=================================== +\begin{problem}[Transformations: given the transformation, find the formula] +Let $r$ be the rational function that has formula. +\[ + r(x)=\frac{x+5}{2x-3} +\] +In each of the following problems apply the given transformation to the function $r$ and +write a formula for the transformed version of $r$. +\begin{multicols}{2} + \begin{subproblem} + Shift $r$ to the right by $3$ units. + \begin{shortsolution} + $r(x-3)=\frac{x+2}{2x-9}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Shift $r$ to the left by $4$ units. + \begin{shortsolution} + $r(x+4)=\frac{x+9}{2x+5}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Shift $r$ up by $\pi$ units. + \begin{shortsolution} + $r(x)+\pi=\frac{x+5}{2x-3}+\pi$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Shift $r$ down by $17$ units. + \begin{shortsolution} + $r(x)-17=\frac{x+5}{2x-3}-17$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Reflect $r$ over the horizontal axis. + \begin{shortsolution} + $-r(x)=-\frac{x+5}{2x-3}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Reflect $r$ over the vertical axis. + \begin{shortsolution} + $r(-x)=\frac{x-5}{2x+3}$ + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} + + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{problem}[Find a formula from a table]\label{rat:prob:findformula} +\Crefrange{rat:tab:findformular}{rat:tab:findformulau} show values of rational functions $r$, $q$, $s$, +and $t$. Assume that any values marked with an X are undefined. + +\begin{table}[!htb] + \begin{widepage} + \centering + \caption{Tables for \cref{rat:prob:findformula}} + \label{rat:tab:findformula} + \begin{subtable}{.2\textwidth} + \centering + \caption{$y=r(x)$} + \label{rat:tab:findformular} + \begin{tabular}{rr} + \beforeheading + $x$ & $y$ \\ \afterheading + $-4$ & $\nicefrac{7}{2}$ \\\normalline + $-3$ & $-18$ \\\normalline + $-2$ & X \\\normalline + $-1$ & $-4$ \\\normalline + $0$ & $\nicefrac{-3}{2}$ \\\normalline + $1$ & $\nicefrac{-2}{3}$ \\\normalline + $2$ & $\nicefrac{-1}{4}$ \\\normalline + $3$ & $0$ \\\normalline + $4$ & $\nicefrac{1}{6}$ \\\lastline + \end{tabular} + \end{subtable} + \hfill + \begin{subtable}{.2\textwidth} + \centering + \caption{$y=s(x)$} + \label{rat:tab:findformulas} + \begin{tabular}{rr} + \beforeheading + $x$ & $y$ \\ \afterheading + $-4$ & $\nicefrac{-2}{21}$ \\\normalline + $-3$ & $\nicefrac{-1}{12}$ \\\normalline + $-2$ & $0$ \\\normalline + $-1$ & X \\\normalline + $0$ & $\nicefrac{-2}{3}$ \\\normalline + $1$ & $\nicefrac{-3}{4}$ \\\normalline + $2$ & $\nicefrac{-4}{3}$ \\\normalline + $3$ & X \\\normalline + $4$ & $\nicefrac{6}{5}$ \\\lastline + \end{tabular} + \end{subtable} + \hfill + \begin{subtable}{.2\textwidth} + \centering + \caption{$y=t(x)$} + \label{rat:tab:findformulat} + \begin{tabular}{rr} + \beforeheading + $x$ & $y$ \\ \afterheading + $-4$ & $\nicefrac{3}{5}$ \\\normalline + $-3$ & $0$ \\\normalline + $-2$ & X \\\normalline + $-1$ & $3$ \\\normalline + $0$ & $3$ \\\normalline + $1$ & X \\\normalline + $2$ & $0$ \\\normalline + $3$ & $\nicefrac{3}{5}$ \\\normalline + $4$ & $\nicefrac{7}{9}$ \\\lastline + \end{tabular} + \end{subtable} + \hfill + \begin{subtable}{.2\textwidth} + \centering + \caption{$y=u(x)$} + \label{rat:tab:findformulau} + \begin{tabular}{rr} + \beforeheading + $x$ & $y$ \\ \afterheading + $-4$ & $\nicefrac{16}{7}$ \\\normalline + $-3$ & X \\\normalline + $-2$ & $-\nicefrac{4}{5}$ \\\normalline + $-1$ & $-\nicefrac{1}{8}$ \\\normalline + $0$ & $0$ \\\normalline + $1$ & $-\nicefrac{1}{8}$ \\\normalline + $2$ & $-\nicefrac{4}{5}$ \\\normalline + $3$ & X \\\normalline + $4$ & $\nicefrac{16}{7}$ \\\lastline + \end{tabular} + \end{subtable} + \end{widepage} +\end{table} +\begin{subproblem} + Given that the formula for $r(x)$ has the form $r(x)=\dfrac{x-A}{x-B}$, use \cref{rat:tab:findformular} + to find values of $A$ and $B$. + \begin{shortsolution} + $A=3$ and $B=-2$, so $r(x)=\dfrac{x-3}{x+2}$. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Check your formula by computing $r(x)$ at the values specified in the table. + \begin{shortsolution} + $\begin{aligned}[t] + r(-4)&= \frac{-4-3}{-4+2}\\ + &= \frac{7}{2}\\ + \end{aligned}$ + + $r(-3)=\ldots$ etc +\end{shortsolution} +\end{subproblem} +\begin{subproblem} + The function $s$ in \cref{rat:tab:findformulas} has two vertical asymptotes and one zero. + Can you find a formula for $s(x)$? + \begin{shortsolution} + $s(x)=\dfrac{x+2}{(x-3)(x+1)}$ + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Check your formula by computing $s(x)$ at the values specified in the table. + \begin{shortsolution} + $\begin{aligned}[t] + s(-4)&=\frac{-4+2}{(-4-3)(-4+1)}\\ + &=-\frac{2}{21} + \end{aligned}$ + + $s(-3)=\ldots$ etc +\end{shortsolution} +\end{subproblem} +\begin{subproblem} + Given that the formula for $t(x)$ has the form $t(x)=\dfrac{(x-A)(x-B)}{(x-C)(x-D)}$, use \cref{rat:tab:findformulat} to find the + values of $A$, $B$, $C$, and $D$; hence write a formula for $t(x)$. + \begin{shortsolution} + $t(x)=\dfrac{(x+3)(x-2)}{(x+2)(x+1)}$ + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Given that the formula for $u(x)$ has the form $u(x)=\dfrac{(x-A)^2}{(x-B)(x-C)}$, use \cref{rat:tab:findformulau} to find the + values of $A$, $B$, and $C$; hence write a formula for $u(x)$. + \begin{shortsolution} + $u(x)=\dfrac{x^2}{(x+3)(x-3)}$ + \end{shortsolution} +\end{subproblem} +\end{problem} +\end{exercises} + +\section{Graphing rational functions (horizontal asymptotes)} +\reformatstepslist{R} % the steps list should be R1, R2, \ldots +We studied rational functions in the previous section, but were +not asked to graph them; in this section we will demonstrate the +steps to be followed in order to sketch graphs of the functions. + +Remember from \vref{rat:def:function} that rational functions have +the form +\[ + r(x)=\frac{p(x)}{q(x)} +\] +In this section we will restrict attention to the case when +\[ + \text{degree of }p\leq \text{degree of }q +\] +Note that this necessarily means that each function that we consider +in this section \emph{will have a horizontal asymptote} (see \vref{rat:def:longrun}). +The cases in which the degree of $p$ is greater than the degree of $q$ +is covered in the next section. + +Before we begin, it is important to remember the following: +\begin{itemize} + \item Our sketches will give a good representation of the overall + shape of the graph, but until we have the tools of calculus (from MTH 251) + we can not find local minimums, local maximums, and inflection points algebraically. This + means that we will make our best guess as to where these points are. + \item We will not concern ourselves too much with the vertical scale (because of + our previous point)| we will, however, mark the vertical intercept (assuming there is one), + and any horizontal asymptotes. +\end{itemize} +\begin{pccspecialcomment}[Steps to follow when sketching rational functions]\label{rat:def:stepsforsketch} + \begin{steps} + \item \label{rat:step:first} Find all vertical asymptotes and holes, and mark them on the + graph using dashed vertical lines and open circles $\circ$ respectively. + \item Find any intercepts, and mark them using solid circles $\bullet$; + determine if the curve cuts the axis, or bounces off it at each zero. + \item Determine the behavior of the function around each asymptote| does + it behave like $\frac{1}{x}$ or $\frac{1}{x^2}$? + \item \label{rat:step:penultimate} Determine the long-run behavior of the function, and mark the horizontal + asymptote using a dashed horizontal line. + \item \label{rat:step:last} Deduce the overall shape of the curve, and sketch it. If there isn't + enough information from the previous steps, then construct a table of values + including sample points from each branch. + \end{steps} + Remember that until we have the tools of calculus, we won't be able to + find the exact coordinates of local minimums, local maximums, and points + of inflection. +\end{pccspecialcomment} + +The examples that follow show how \crefrange{rat:step:first}{rat:step:last} can be +applied to a variety of different rational functions. + +%=================================== +% Author: Hughes +% Date: May 2012 +%=================================== +\begin{pccexample}\label{rat:ex:1overxminus2p2} +Use \crefrange{rat:step:first}{rat:step:last} to sketch a graph of the function $r$ +that has formula +\[ + r(x)=\frac{1}{x-2} +\] +\begin{pccsolution} +\begin{steps} + \item $r$ has a vertical asymptote at $2$; $r$ does not have any holes. The curve of + $r$ will have $2$ branches. + \item $r$ does not have any zeros since the numerator is never equal to $0$. The + vertical intercept of $r$ is $\left( 0,-\frac{1}{2} \right)$. + \item $r$ behaves like $\frac{1}{x}$ around its vertical asymptote since $(x-2)$ + is raised to the power $1$. + \item Since the degree of the numerator is less than the degree of the denominator, + according to \vref{rat:def:longrun} the horizontal asymptote of $r$ has equation $y=0$. + \item We put the details we have obtained so far on \cref{rat:fig:1overxminus2p1}. Notice + that there is only one way to complete the graph, which we have done in \cref{rat:fig:1overxminus2p2}. +\end{steps} +\end{pccsolution} +\end{pccexample} + +\begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-5,ymax=5, + width=\textwidth, + ] + \addplot[asymptote,domain=-5:5]({2},{x}); + \addplot[asymptote,domain=-5:5]({x},{0}); + \addplot[soldot] coordinates{(0,-0.5)}node[axisnode,anchor=north east]{$\left( 0,-\frac{1}{2} \right)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:1overxminus2p1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=1/(x-2);}] + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-5,ymax=5, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-5:1.8,samples=50]{f}; + \addplot[pccplot] expression[domain=2.2:5]{f}; + \addplot[asymptote,domain=-5:5]({2},{x}); + \addplot[asymptote,domain=-5:5]({x},{0}); + \addplot[soldot] coordinates{(0,-0.5)}node[axisnode,anchor=north east]{$\left( 0,-\frac{1}{2} \right)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:1overxminus2p2} + \end{subfigure}% + \caption{$y=\dfrac{1}{x-2}$} +\end{figure} + +The function $r$ in \cref{rat:ex:1overxminus2p2} has a horizontal asymptote which has equation $y=0$. +This asymptote lies on the horizontal axis, and you might (understandably) find it hard +to distinguish between the two lines (\cref{rat:fig:1overxminus2p2}). When faced +with such a situation, it is perfectly acceptable to draw the horizontal axis +as a dashed line| just make sure to label it correctly. We will demonstrate this +in the next example. + +%=================================== +% Author: Hughes +% Date: May 2012 +%=================================== +\begin{pccexample}\label{rat:ex:1overxp1} +Use \crefrange{rat:step:first}{rat:step:last} to sketch a graph of the function $v$ +that has formula +\[ + v(x)=\frac{10}{x} +\] +\begin{pccsolution} +\begin{steps} + \item $v$ has a vertical asymptote at $0$. $v$ does not have + any holes. The curve of $v$ will have $2$ branches. + \item $v$ does not have any zeros (since $10\ne 0$). Furthermore, $v$ + does not have a vertical intercept since $v(0)$ is undefined. + \item $v$ behaves like $\frac{1}{x}$ around its vertical asymptote. + \item $v$ has a horizontal asymptote with equation $y=0$. + \item We put the details we have obtained so far in \cref{rat:fig:1overxp1}. + We do not have enough information to sketch $v$ yet (because $v$ does + not have any intercepts), so let's pick a sample + point in either of the $2$ branches| it doesn't matter where our sample point + is, because we know what the overall shape will be. Let's compute $v(2)$ + \begin{align*} + v(2) & =\dfrac{10}{2} \\ + & = 5 + \end{align*} + We therefore mark the point $(2,5)$ on \cref{rat:fig:1overxp2}, and then complete the sketch using + the details we found in the previous steps. +\end{steps} + +\begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-5,5}, + ytick={-5,5}, + axis line style={color=white}, + width=\textwidth, + ] + \addplot[asymptote,<->,domain=-10:10]({0},{x}); + \addplot[asymptote,<->,domain=-10:10]({x},{0}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:1overxp1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=10/x;}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-5,5}, + ytick={-5,5}, + axis line style={color=white}, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:-1]{f}; + \addplot[pccplot] expression[domain=1:10]{f}; + \addplot[soldot] coordinates{(2,5)}node[axisnode,anchor=south west]{$(2,5)$}; + \addplot[asymptote,<->,domain=-10:10]({0},{x}); + \addplot[asymptote,<->,domain=-10:10]({x},{0}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:1overxp2} + \end{subfigure}% + \caption{$y=\dfrac{10}{x}$} +\end{figure} +\end{pccsolution} +\end{pccexample} + +%=================================== +% Author: Hughes +% Date: May 2012 +%=================================== +\begin{pccexample}\label{rat:ex:asympandholep1} +Use \crefrange{rat:step:first}{rat:step:last} to sketch a graph of the function $u$ +that has formula +\[ + u(x)=\frac{-4(x^2-9)}{x^2-8x+15} +\] +\begin{pccsolution} +\begin{steps} + \item We begin by factoring both the numerator and denominator of $u$ to help + us find any vertical asymptotes or holes + \begin{align*} + u(x) & =\frac{-4(x^2-9)}{x^2-8x+15} \\ + & =\frac{-4(x+3)(x-3)}{(x-5)(x-3)} \\ + & =\frac{-4(x+3)}{x-5} + \end{align*} + provided that $x\ne 3$. Therefore $u$ has a vertical asymptote at $5$ and + a hole at $3$. The curve of $u$ has $2$ branches. + \item $u$ has a simple zero at $-3$. The vertical intercept of $u$ is $\left( 0,\frac{12}{5} \right)$. + \item $u$ behaves like $\frac{1}{x}$ around its vertical asymptote at $4$. + \item Using \vref{rat:def:longrun} the equation of the horizontal asymptote of $u$ is $y=-4$. + \item We put the details we have obtained so far on \cref{rat:fig:1overxminus2p1}. Notice + that there is only one way to complete the graph, which we have done in \cref{rat:fig:1overxminus2p2}. +\end{steps} + +\begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-20,ymax=20, + xtick={-8,-6,...,8}, + ytick={-10,10}, + width=\textwidth, + ] + \addplot[asymptote,domain=-20:20]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{-4}); + \addplot[soldot] coordinates{(-3,0)(0,2.4)}node[axisnode,anchor=south east]{$\left( 0,\frac{12}{5} \right)$}; + \addplot[holdot] coordinates{(3,12)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:asympandholep1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=-4*(x+3)/(x-5);}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-20,ymax=20, + xtick={-8,-6,...,8}, + ytick={-10,10}, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:3.6666,samples=50]{f}; + \addplot[pccplot] expression[domain=7:10]{f}; + \addplot[asymptote,domain=-20:20]({5},{x}); + \addplot[asymptote,domain=-10:10]({x},{-4}); + \addplot[soldot] coordinates{(-3,0)(0,2.4)}node[axisnode,anchor=south east]{$\left( 0,\frac{12}{5} \right)$}; + \addplot[holdot] coordinates{(3,12)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:asympandholep2} + \end{subfigure}% + \caption{$y=\dfrac{-4(x+3)}{x-5}$} +\end{figure} +\end{pccsolution} +\end{pccexample} + +\Cref{rat:ex:1overxminus2p2,rat:ex:1overxp1,rat:ex:asympandholep1} have focused on functions +that only have one vertical asymptote; the remaining examples in this section +concern functions that have more than one vertical asymptote. We will demonstrate +that \crefrange{rat:step:first}{rat:step:last} still apply. + +%=================================== +% Author: Hughes +% Date: May 2012 +%=================================== +\begin{pccexample}\label{rat:ex:sketchtwoasymp} +Use \crefrange{rat:step:first}{rat:step:last} to sketch a graph of the function $w$ +that has formula +\[ + w(x)=\frac{2(x+3)(x-5)}{(x+5)(x-4)} +\] +\begin{pccsolution} +\begin{steps} + \item $w$ has vertical asymptotes at $-5$ and $4$. $w$ does not have + any holes. The curve of $w$ will have $3$ branches. + \item $w$ has simple zeros at $-3$ and $5$. The vertical intercept of $w$ + is $\left( 0,\frac{3}{2} \right)$. + \item $w$ behaves like $\frac{1}{x}$ around both of its vertical + asymptotes. + \item The degree of the numerator of $w$ is $2$ and the degree of the + denominator of $w$ is also $2$. Using the ratio of the leading coefficients + of the numerator and denominator, we say that $w$ has a horizontal + asymptote with equation $y=\frac{2}{1}=2$. + \item We put the details we have obtained so far on \cref{rat:fig:sketchtwoasymptp1}. + + The function $w$ is a little more complicated than the functions that + we have considered in the previous examples because the curve has $3$ + branches. When graphing such functions, it is generally a good idea to start with the branch + for which you have the most information| in this case, that is the \emph{middle} branch + on the interval $(-5,4)$. + + Once we have drawn the middle branch, there is only one way to complete the graph + (because of our observations about the behavior of $w$ around its vertical asymptotes), + which we have done in \cref{rat:fig:sketchtwoasymptp2}. +\end{steps} +\end{pccsolution} +\end{pccexample} + +\begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-5,5}, + width=\textwidth, + ] + \addplot[asymptote,domain=-10:10]({-5},{x}); + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{2}); + \addplot[soldot] coordinates{(-3,0)(5,0)}; + \addplot[soldot] coordinates{(0,1.5)}node[axisnode,anchor=north west]{$\left( 0,\frac{3}{2} \right)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:sketchtwoasymptp1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=2*(x+3)*(x-5)/( (x+5)*(x-4));}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-5,5}, + width=\textwidth, + ] + \addplot[asymptote,domain=-10:10]({-5},{x}); + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{2}); + \addplot[soldot] coordinates{(-3,0)(5,0)}; + \addplot[soldot] coordinates{(0,1.5)}node[axisnode,anchor=north west]{$\left( 0,\frac{3}{2} \right)$}; + \addplot[pccplot] expression[domain=-10:-5.56708]{f}; + \addplot[pccplot] expression[domain=-4.63511:3.81708]{f}; + \addplot[pccplot] expression[domain=4.13511:10]{f}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:sketchtwoasymptp2} + \end{subfigure}% + \caption{$y=\dfrac{2(x+3)(x-5)}{(x+5)(x-4)}$} +\end{figure} + +The rational functions that we have considered so far have had simple +factors in the denominator; each function has behaved like $\frac{1}{x}$ +around each of its vertical asymptotes. \Cref{rat:ex:2asympnozeros,rat:ex:2squaredasymp} +consider functions that have a repeated factor in the denominator. + +%=================================== +% Author: Hughes +% Date: May 2012 +%=================================== +\begin{pccexample}\label{rat:ex:2asympnozeros} +Use \crefrange{rat:step:first}{rat:step:last} to sketch a graph of the function $f$ +that has formula +\[ + f(x)=\frac{100}{(x+5)(x-4)^2} +\] +\begin{pccsolution} +\begin{steps} + \item $f$ has vertical asymptotes at $-5$ and $4$. $f$ does not have + any holes. The curve of $f$ will have $3$ branches. + \item $f$ does not have any zeros (since $100\ne 0$). The vertical intercept of $f$ + is $\left( 0,\frac{5}{4} \right)$. + \item $f$ behaves like $\frac{1}{x}$ around $-5$ and behaves like $\frac{1}{x^2}$ + around $4$. + \item The degree of the numerator of $f$ is $0$ and the degree of the + denominator of $f$ is $2$. $f$ has a horizontal asymptote with + equation $y=0$. + \item We put the details we have obtained so far on \cref{rat:fig:2asympnozerosp1}. + + The function $f$ is similar to the function $w$ that we considered in \cref{rat:ex:sketchtwoasymp}| + it has two vertical asymptotes and $3$ branches, but in contrast to $w$ it does not have any zeros. + + We sketch $f$ in \cref{rat:fig:2asympnozerosp2}, using the middle branch as our guide + because we have the most information about the function on the interval $(-5,4)$. + + Once we have drawn the middle branch, there is only one way to complete the graph + because of our observations about the behavior of $f$ around its vertical asymptotes (it behaves like $\frac{1}{x}$), + which we have done in \cref{rat:fig:2asympnozerosp2}. + + Note that we are not yet able to find the local minimum of $f$ algebraically on the interval $(-5,4)$, + so we make a reasonable guess as to where it is| we can be confident that it is above the horizontal axis + since $f$ has no zeros. You may think that this is unsatisfactory, but once we have the tools of calculus, we will + be able to find local minimums more precisely. +\end{steps} +\end{pccsolution} +\end{pccexample} + +\begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-5,5}, + width=\textwidth, + ] + \addplot[asymptote,domain=-10:10]({-5},{x}); + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{0}); + \addplot[soldot] coordinates{(0,1.25)}node[axisnode,anchor=south east]{$\left( 0,\frac{5}{4} \right)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:2asympnozerosp1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=100/( (x+5)*(x-4)^2);}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-5,5}, + width=\textwidth, + ] + \addplot[asymptote,domain=-10:10]({-5},{x}); + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{0}); + \addplot[soldot] coordinates{(0,1.25)}node[axisnode,anchor=south east]{$\left( 0,\frac{5}{4} \right)$}; + \addplot[pccplot] expression[domain=-10:-5.12022]{f}; + \addplot[pccplot] expression[domain=-4.87298:2.87298,samples=50]{f}; + \addplot[pccplot] expression[domain=5:10]{f}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:2asympnozerosp2} + \end{subfigure}% + \caption{$y=\dfrac{100}{(x+5)(x-4)^2}$} +\end{figure} + +%=================================== +% Author: Hughes +% Date: May 2012 +%=================================== +\begin{pccexample}\label{rat:ex:2squaredasymp} +Use \crefrange{rat:step:first}{rat:step:last} to sketch a graph of the function $g$ +that has formula +\[ + g(x)=\frac{50(2-x)}{(x+3)^2(x-5)^2} +\] +\begin{pccsolution} +\begin{steps} + \item $g$ has vertical asymptotes at $-3$ and $5$. $g$ does + not have any holes. The curve of $g$ will have $3$ branches. + \item $g$ has a simple zero at $2$. The vertical intercept of $g$ is + $\left( 0,\frac{4}{9} \right)$. + \item $g$ behaves like $\frac{1}{x^2}$ around both of its + vertical asymptotes. + \item The degree of the numerator of $g$ is $1$ and the degree of the denominator + of $g$ is $4$. Using \vref{rat:def:longrun}, we calculate that + the horizontal asymptote of $g$ has equation $y=0$. + \item The details that we have found so far have been drawn in + \cref{rat:fig:2squaredasymp1}. The function $g$ is similar to the functions + we considered in \cref{rat:ex:sketchtwoasymp,rat:ex:2asympnozeros} because + it has $2$ vertical asymptotes and $3$ branches. + + We sketch $g$ using the middle branch as our guide because we have the most information + about $g$ on the interval $(-3,5)$. Note that there is no other way to draw this branch + without introducing other zeros which $g$ does not have. + + Once we have drawn the middle branch, there is only one way to complete the graph + because of our observations about the behavior of $g$ around its vertical asymptotes| it + behaves like $\frac{1}{x^2}$. + +\end{steps} +\end{pccsolution} +\end{pccexample} + +\begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-5,5}, + width=\textwidth, + ] + \addplot[asymptote,domain=-10:10]({-3},{x}); + \addplot[asymptote,domain=-10:10]({5},{x}); + \addplot[asymptote,domain=-10:10]({x},{0}); + \addplot[soldot] coordinates{(2,0)(0,4/9)}node[axisnode,anchor=south west]{$\left( 0,\frac{4}{9} \right)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:2squaredasymp1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=50*(2-x)/( (x+3)^2*(x-5)^2);}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-5,5}, + width=\textwidth, + ] + \addplot[asymptote,domain=-10:10]({-3},{x}); + \addplot[asymptote,domain=-10:10]({5},{x}); + \addplot[asymptote,domain=-10:10]({x},{0}); + \addplot[soldot] coordinates{(2,0)(0,4/9)}node[axisnode,anchor=south west]{$\left( 0,\frac{4}{9} \right)$}; + \addplot[pccplot] expression[domain=-10:-3.61504]{f}; + \addplot[pccplot] expression[domain=-2.3657:4.52773]{f}; + \addplot[pccplot] expression[domain=5.49205:10]{f}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:2squaredasymp2} + \end{subfigure}% + \caption{$y=\dfrac{50(2-x)}{(x+3)^2(x-5)^2}$} +\end{figure} + +Each of the rational functions that we have considered so far has had either +a \emph{simple} zero, or no zeros at all. Remember from our work on polynomial +functions, and particularly \vref{poly:def:multzero}, that a \emph{repeated} zero +corresponds to the curve of the function behaving differently at the zero +when compared to how the curve behaves at a simple zero. \Cref{rat:ex:doublezero} details a +function that has a non-simple zero. + +%=================================== +% Author: Hughes +% Date: June 2012 +%=================================== +\begin{pccexample}\label{rat:ex:doublezero} +Use \crefrange{rat:step:first}{rat:step:last} to sketch a graph of the function $g$ +that has formula +\[ + h(x)=\frac{(x-3)^2}{(x+4)(x-6)} +\] +\begin{pccsolution} +\begin{steps} + \item $h$ has vertical asymptotes at $-4$ and $6$. $h$ does + not have any holes. The curve of $h$ will have $3$ branches. + \item $h$ has a zero at $3$ that has \emph{multiplicity $2$}. + The vertical intercept of $h$ is + $\left( 0,-\frac{3}{8} \right)$. + \item $h$ behaves like $\frac{1}{x}$ around both of its + vertical asymptotes. + \item The degree of the numerator of $h$ is $2$ and the degree of the denominator + of $h$ is $2$. Using \vref{rat:def:longrun}, we calculate that + the horizontal asymptote of $h$ has equation $y=1$. + \item The details that we have found so far have been drawn in + \cref{rat:fig:doublezerop1}. The function $h$ is different + from the functions that we have considered in previous examples because + of the multiplicity of the zero at $3$. + + We sketch $h$ using the middle branch as our guide because we have the most information + about $h$ on the interval $(-4,6)$. Note that there is no other way to draw this branch + without introducing other zeros which $h$ does not have| also note how + the curve bounces off the horizontal axis at $3$. + + Once we have drawn the middle branch, there is only one way to complete the graph + because of our observations about the behavior of $h$ around its vertical asymptotes| it + behaves like $\frac{1}{x}$. + +\end{steps} +\end{pccsolution} +\end{pccexample} + +\begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-5,ymax=5, + xtick={-8,-6,...,8}, + ytick={-3,3}, + width=\textwidth, + ] + \addplot[asymptote,domain=-10:10]({-4},{x}); + \addplot[asymptote,domain=-10:10]({6},{x}); + \addplot[asymptote,domain=-10:10]({x},{1}); + \addplot[soldot] coordinates{(3,0)(0,-3/8)}node[axisnode,anchor=north west]{$\left( 0,-\frac{3}{8} \right)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:doublezerop1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=(x-3)^2/((x+4)*(x-6));}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-5,ymax=5, + xtick={-8,-6,...,8}, + ytick={-3,3}, + width=\textwidth, + ] + \addplot[asymptote,domain=-10:10]({-4},{x}); + \addplot[asymptote,domain=-10:10]({6},{x}); + \addplot[asymptote,domain=-10:10]({x},{1}); + \addplot[soldot] coordinates{(3,0)(0,-3/8)}node[axisnode,anchor=north west]{$\left( 0,-\frac{3}{8} \right)$}; + \addplot[pccplot] expression[domain=-10:-5.20088]{f}; + \addplot[pccplot] expression[domain=-3.16975:5.83642,samples=50]{f}; + \addplot[pccplot] expression[domain=6.20088:10]{f}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:doublezerop2} + \end{subfigure}% + \caption{$y=\dfrac{(x-3)^2}{(x+4)(x-6)}$} +\end{figure} +\begin{exercises} +%=================================== +% Author: Hughes +% Date: June 2012 +%=================================== +\begin{problem}[\Cref{rat:step:last}]\label{rat:prob:deduce} +\pccname{Katie} is working on graphing rational functions. She +has been concentrating on functions that have the form +\begin{equation}\label{rat:eq:deducecurve} + f(x)=\frac{a(x-b)}{x-c} +\end{equation} +Katie notes that functions with this type of formula have a zero +at $b$, and a vertical asymptote at $c$. Furthermore, these functions +behave like $\frac{1}{x}$ around their vertical asymptote, and the +curve of each function will have $2$ branches. + +Katie has been working with $3$ functions that have the form given +in \cref{rat:eq:deducecurve}, and has followed \crefrange{rat:step:first}{rat:step:penultimate}; +her results are shown in \cref{rat:fig:deducecurve}. There is just one +more thing to do to complete the graphs| follow \cref{rat:step:last}. +Help Katie finish each graph by deducing the curve of each function. +\begin{shortsolution} + \Vref{rat:fig:deducecurve1} + + \begin{tikzpicture}[/pgf/declare function={f=3*(x+4)/(x+5);}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\solutionfigurewidth, + ] + \addplot[soldot] coordinates{(-4,0)(0,12/5)}; + \addplot[asymptote,domain=-10:10]({-5},{x}); + \addplot[asymptote,domain=-10:10]({x},{3}); + \addplot[pccplot] expression[domain=-10:-5.42857]{f}; + \addplot[pccplot] expression[domain=-4.76923:10,samples=50]{f}; + \end{axis} + \end{tikzpicture} + + \Vref{rat:fig:deducecurve2} + + \begin{tikzpicture}[/pgf/declare function={f=-3*(x-2)/(x-4);}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\solutionfigurewidth, + ] + \addplot[soldot] coordinates{(2,0)(0,-3/2)}; + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{-3}); + \addplot[pccplot] expression[domain=-10:3.53846,samples=50]{f}; + \addplot[pccplot] expression[domain=4.85714:10]{f}; + \end{axis} + \end{tikzpicture} + + \Vref{rat:fig:deducecurve4} + + \begin{tikzpicture}[/pgf/declare function={f=2*(x-6)/(x-4);}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\solutionfigurewidth, + ] + \addplot[soldot] coordinates{(6,0)(0,3)}; + \addplot[asymptote,domain=-10:10]({x},{2}); + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[pccplot] expression[domain=-10:3.5,samples=50]{f}; + \addplot[pccplot] expression[domain=4.3333:10]{f}; + \end{axis} + \end{tikzpicture} +\end{shortsolution} +\end{problem} + +\begin{figure}[!htb] + \begin{widepage} + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-4,0)(0,12/5)}; + \addplot[asymptote,domain=-10:10]({-5},{x}); + \addplot[asymptote,domain=-10:10]({x},{3}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:deducecurve1} + \end{subfigure}% + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(2,0)(0,-3/2)}; + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{-3}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:deducecurve2} + \end{subfigure}% + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(6,0)(0,3)}; + \addplot[asymptote,domain=-10:10]({x},{2}); + \addplot[asymptote,domain=-10:10]({4},{x}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:deducecurve4} + \end{subfigure} + \caption{Graphs for \cref{rat:prob:deduce}} + \label{rat:fig:deducecurve} + \end{widepage} +\end{figure} + +%=================================== +% Author: Hughes +% Date: June 2012 +%=================================== +\begin{problem}[\Cref{rat:step:last} for more complicated rational functions]\label{rat:prob:deducehard} +\pccname{David} is also working on graphing rational functions, and +has been concentrating on functions that have the form +\[ + r(x)=\frac{a(x-b)(x-c)}{(x-d)(x-e)} +\] +David notices that functions with this type of formula have simple zeros +at $b$ and $c$, and vertical asymptotes at $d$ and $e$. Furthermore, +these functions behave like $\frac{1}{x}$ around both vertical asymptotes, +and the curve of the function will have $3$ branches. + +David has followed \crefrange{rat:step:first}{rat:step:penultimate} for +$3$ separate functions, and drawn the results in \cref{rat:fig:deducehard}. +Help David finish each graph by deducing the curve of each function. +\begin{shortsolution} + \Vref{rat:fig:deducehard1} + + \begin{tikzpicture}[/pgf/declare function={f=(x-6)*(x+3)/( (x-4)*(x+1));}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\solutionfigurewidth, + ] + \addplot[soldot] coordinates{(-3,0)(6,0)(0,9/2)}; + \addplot[asymptote,domain=-10:10]({-1},{x}); + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{2}); + \addplot[pccplot] expression[domain=-10:-1.24276]{f}; + \addplot[pccplot] expression[domain=-0.6666:3.66667]{f}; + \addplot[pccplot] expression[domain=4.24276:10]{f}; + \end{axis} + \end{tikzpicture} + + \Vref{rat:fig:deducehard2} + + \begin{tikzpicture}[/pgf/declare function={f=3*(x-2)*(x+3)/( (x-6)*(x+5));}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\solutionfigurewidth, + ] + \addplot[soldot] coordinates{(-3,0)(2,0)(0,3/5)}; + \addplot[asymptote,domain=-10:10]({-5},{x}); + \addplot[asymptote,domain=-10:10]({6},{x}); + \addplot[asymptote,domain=-10:10]({x},{3}); + \addplot[pccplot] expression[domain=-10:-5.4861]{f}; + \addplot[pccplot] expression[domain=-4.68395:5.22241]{f}; + \addplot[pccplot] expression[domain=7.34324:10]{f}; + \end{axis} + \end{tikzpicture} + + \Vref{rat:fig:deducehard3} + + \begin{tikzpicture}[/pgf/declare function={f=2*(x-7)*(x+3)/( (x+6)*(x-5));}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\solutionfigurewidth, + ] + \addplot[soldot] coordinates{(-3,0)(7,0)(0,1.4)}; + \addplot[asymptote,domain=-10:10]({-6},{x}); + \addplot[asymptote,domain=-10:10]({5},{x}); + \addplot[asymptote,domain=-10:10]({x},{2}); + \addplot[pccplot] expression[domain=-10:-6.91427]{f}; + \addplot[pccplot] expression[domain=-5.42252:4.66427]{f}; + \addplot[pccplot] expression[domain=5.25586:10]{f}; + \end{axis} + \end{tikzpicture} + +\end{shortsolution} +\end{problem} + +\begin{figure}[!htb] + \begin{widepage} + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-3,0)(6,0)(0,9/2)}; + \addplot[asymptote,domain=-10:10]({-1},{x}); + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{2}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:deducehard1} + \end{subfigure}% + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-3,0)(2,0)(0,3/5)}; + \addplot[asymptote,domain=-10:10]({-5},{x}); + \addplot[asymptote,domain=-10:10]({6},{x}); + \addplot[asymptote,domain=-10:10]({x},{3}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:deducehard2} + \end{subfigure}% + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-3,0)(7,0)(0,1.4)}; + \addplot[asymptote,domain=-10:10]({-6},{x}); + \addplot[asymptote,domain=-10:10]({5},{x}); + \addplot[asymptote,domain=-10:10]({x},{2}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:deducehard3} + \end{subfigure}% + \hfill + \caption{Graphs for \cref{rat:prob:deducehard}} + \label{rat:fig:deducehard} + \end{widepage} +\end{figure} +%=================================== +% Author: Adams (Hughes) +% Date: March 2012 +%=================================== +\begin{problem}[\Crefrange{rat:step:first}{rat:step:last}] +Use \crefrange{rat:step:first}{rat:step:last} to sketch a graph of +each of the following functions +\fixthis{need 2 more subproblems here} +\begin{multicols}{4} + \begin{subproblem} + $y=\dfrac{4}{x+2}$ + \begin{shortsolution} + Vertical intercept: $(0,2)$; vertical asymptote: $x=-2$, horizontal asymptote: $y=0$. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-5,xmax=5, + ymin=-5,ymax=5, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot] expression[domain=-5:-2.8]{4/(x+2)}; + \addplot[pccplot] expression[domain=-1.2:5]{4/(x+2)}; + \addplot[soldot]coordinates{(0,2)}; + \addplot[asymptote,domain=-5:5]({-2},{x}); + \addplot[asymptote,domain=-5:5]({x},{0}); + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=\dfrac{2x-1}{x^2-9}$ + \begin{shortsolution} + Vertical intercept:$\left( 0,\frac{1}{9} \right)$; + horizontal intercept: $\left( \frac{1}{2},0 \right)$; + vertical asymptotes: $x=-3$, $x=3$, horizontal asymptote: $y=0$. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-5,xmax=5, + ymin=-5,ymax=5, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot] expression[domain=-5:-3.23974]{(2*x-1)/(x^2-9)}; + \addplot[pccplot,samples=50] expression[domain=-2.77321:2.83974]{(2*x-1)/(x^2-9)}; + \addplot[pccplot] expression[domain=3.17321:5]{(2*x-1)/(x^2-9)}; + \addplot[soldot]coordinates{(0,1/9)(1/2,0)}; + \addplot[asymptote,domain=-5:5]({-3},{x}); + \addplot[asymptote,domain=-5:5]({3},{x}); + \addplot[asymptote,domain=-5:5]({x},{0}); + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=\dfrac{x+3}{x-5}$ + \begin{shortsolution} + Vertical intercept $\left( 0,-\frac{3}{5} \right)$; horizontal + intercept: $(-3,0)$; vertical asymptote: $x=5$; horizontal asymptote: $y=1$. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-5,ymax=5, + xtick={-8,-6,...,8}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot] expression[domain=-10:3.666]{(x+3)/(x-5)}; + \addplot[pccplot] expression[domain=7:10]{(x+3)/(x-5)}; + \addplot[asymptote,domain=-5:5]({5},{x}); + \addplot[asymptote,domain=-10:10]({x},{1}); + \addplot[soldot]coordinates{(0,-3/5)(-3,0)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=\dfrac{2x+3}{3x-1}$ + \begin{shortsolution} + Vertical intercept: $(0,-3)$; horizontal intercept: $\left( -\frac{3}{2},0 \right)$; + vertical asymptote: $x=\frac{1}{3}$, horizontal asymptote: $y=\frac{2}{3}$. + + \begin{tikzpicture}[/pgf/declare function={f=(2*x+3)/(3*x-1);}] + \begin{axis}[ + framed, + xmin=-5,xmax=5, + ymin=-5,ymax=5, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot] expression[domain=-5:0.1176]{f}; + \addplot[pccplot] expression[domain=0.6153:5]{f}; + \addplot[asymptote,domain=-5:5]({1/3},{x}); + \addplot[asymptote,domain=-5:5]({x},{2/3}); + \addplot[soldot]coordinates{(0,-3)(-3/2,0)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=\dfrac{4-x^2}{x^2-9}$ + \begin{shortsolution} + Vertical intercept: $\left( 0,-\frac{4}{9} \right)$; + horizontal intercepts: $(2,0)$, $(-2,0)$; + vertical asymptotes: $x=-3$, $x=3$; horizontal asymptote: $y=-1$. + + \begin{tikzpicture}[/pgf/declare function={f=(4-x^2)/(x^2-9);}] + \begin{axis}[ + framed, + xmin=-5,xmax=5, + ymin=-5,ymax=5, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot] expression[domain=-5:-3.20156]{f}; + \addplot[pccplot,samples=50] expression[domain=-2.85774:2.85774]{f}; + \addplot[pccplot] expression[domain=3.20156:5]{f}; + \addplot[asymptote,domain=-5:5]({-3},{x}); + \addplot[asymptote,domain=-5:5]({3},{x}); + \addplot[asymptote,domain=-5:5]({x},{-1}); + \addplot[soldot] coordinates{(-2,0)(2,0)(0,-4/9)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=\dfrac{(4x+5)(3x-4)}{(2x+5)(x-5)}$ + \begin{shortsolution} + Vertical intercept: $\left( 0,\frac{4}{5} \right)$; + horizontal intercepts: $\left( -\frac{5}{4},0 \right)$, $\left( \frac{4}{3},0 \right)$; + vertical asymptotes: $x=-\frac{5}{2}$, $x=5$; horizontal asymptote: $y=6$. + + \begin{tikzpicture}[/pgf/declare function={f=(4*x+5)*(3*x-4)/((2*x+5)*(x-5));}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-20,ymax=20, + xtick={-8,-6,...,8}, + ytick={-10,0,...,10}, + minor ytick={-15,-5,...,15}, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot] expression[domain=-10:-2.73416]{f}; + \addplot[pccplot] expression[domain=-2.33689:4.2792]{f}; + \addplot[pccplot] expression[domain=6.26988:10]{f}; + \addplot[asymptote,domain=-20:20]({-5/2},{x}); + \addplot[asymptote,domain=-20:20]({5},{x}); + \addplot[asymptote,domain=-10:10]({x},{6}); + \addplot[soldot]coordinates{(0,4/5)(-5/4,0)(4/3,0)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{problem}[Inverse functions] +Each of the following rational functions are invertible +\[ + F(x)=\frac{2x+1}{x-3}, \qquad G(x)= \frac{1-4x}{x+3} +\] +\begin{subproblem} + State the domain of each function. + \begin{shortsolution} + \begin{itemize} + \item The domain of $F$ is $(-\infty,3)\cup(3,\infty)$. + \item The domain of $G$ is $(-\infty,-3)\cup(-3,\infty)$. + \end{itemize} + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Find the inverse of each function, and state its domain. + \begin{shortsolution} + \begin{itemize} + \item $F^{-1}(x)=\frac{3x+1}{x-2}$; the domain of $F^{-1}$ is $(-\infty,2)\cup(2,\infty)$. + \item $G^{-1}(x)=\frac{3x+1}{x+4}$; the domain of $G^{-1}$ is $(-\infty,-4)\cup(-4,\infty)$. + \end{itemize} + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Hence state the range of the original functions. + \begin{shortsolution} + \begin{itemize} + \item The range of $F$ is the domain of $F^{-1}$, which is $(-\infty,2)\cup(2,\infty)$. + \item The range of $G$ is the domain of $G^{-1}$, which is $(-\infty,-4)\cup(-4,\infty)$. + \end{itemize} + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + State the range of each inverse function. + \begin{shortsolution} + \begin{itemize} + \item The range of $F^{-1}$ is the domain of $F$, which is $(-\infty,3)\cup(3,\infty)$. + \item The range of $G^{-1}$ is the domain of $G$, which is $(-\infty,-3)\cup(-3,\infty)$. + \end{itemize}<++> + \end{shortsolution} +\end{subproblem} +\end{problem} +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{problem}[Composition] +Let $r$ and $s$ be the rational functions that have formulas +\[ + r(x)=\frac{3}{x^2},\qquad s(x)=\frac{4-x}{x+5} +\] +Evaluate each of the following. +\begin{multicols}{3} + \begin{subproblem} + $(r\circ s)(0)$ + \begin{shortsolution} + $\frac{75}{16}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(s\circ r)(0)$ + \begin{shortsolution} + $(s\circ r)(0)$ is undefined. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(r\circ s)(2)$ + \begin{shortsolution} + $\frac{147}{4}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(s\circ r)(3)$ + \begin{shortsolution} + $192$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(s\circ r)(4)$ + \begin{shortsolution} + $(s\circ r)(4)$ is undefined. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(s\circ r)(x)$ + \begin{shortsolution} + $\dfrac{4x^2-3}{1+5x^2}$ + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} +%=================================== +% Author: Hughes +% Date: March 2012 +%=================================== +\begin{problem}[Piecewise rational functions] +The function $R$ has formula +\[ + R(x)= + \begin{dcases} + \frac{2}{x+3}, & x<-5 \\ + \frac{x-4}{x-10}, & x\geq -5 + \end{dcases} +\] +Evaluate each of the following. +\begin{multicols}{4} + \begin{subproblem} + $R(-6)$ + \begin{shortsolution} + $-\frac{2}{3}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $R(-5)$ + \begin{shortsolution} + $\frac{3}{5}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $R(-3)$ + \begin{shortsolution} + $\frac{7}{13}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $R(5)$ + \begin{shortsolution} + $-\frac{1}{5}$ + \end{shortsolution} + \end{subproblem} +\end{multicols} +\begin{subproblem} + What is the domain of $R$? + \begin{shortsolution} + $(-\infty,10)\cup(10,\infty)$ + \end{shortsolution} +\end{subproblem} +\end{problem} +\end{exercises} + +\section{Graphing rational functions (oblique asymptotes)}\label{rat:sec:oblique} +\begin{subproblem} + $y=\dfrac{x^2+1}{x-4}$ + \begin{shortsolution} + \begin{enumerate} + \item $\left( 0,-\frac{1}{4} \right)$ + \item Vertical asymptote: $x=4$. + \item A graph of the function is shown below + + \begin{tikzpicture}[/pgf/declare function={f=(x^2+1)/(x-4);}] + \begin{axis}[ + framed, + xmin=-20,xmax=20, + ymin=-30,ymax=30, + xtick={-10,10}, + minor xtick={-15,-5,...,15}, + minor ytick={-10,10}, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot,samples=50] expression[domain=-20:3.54724]{f}; + \addplot[pccplot,samples=50] expression[domain=4.80196:20]{f}; + \addplot[asymptote,domain=-30:30]({4},{x}); + \end{axis} + \end{tikzpicture} + \end{enumerate} + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + $y=\dfrac{x^3(x+3)}{x-5}$ + \begin{shortsolution} + \begin{enumerate} + \item $(0,0)$, $(-3,0)$ + \item Vertical asymptote: $x=5$, horizontal asymptote: none. + \item A graph of the function is shown below + + \begin{tikzpicture}[/pgf/declare function={f=x^3*(x+3)/(x-5);}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-500,ymax=2500, + xtick={-8,-6,...,8}, + ytick={500,1000,1500,2000}, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot,samples=50] expression[domain=-10:4]{f}; + \addplot[pccplot] expression[domain=5.6068:9.777]{f}; + \addplot[asymptote,domain=-500:2500]({5},{x}); + \end{axis} + \end{tikzpicture} + \end{enumerate} + \end{shortsolution} +\end{subproblem} diff --git a/Master/texmf-dist/doc/support/latexindent/success/sampleBEFORE.tex b/Master/texmf-dist/doc/support/latexindent/success/sampleBEFORE.tex new file mode 100644 index 00000000000..757f65c557e --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/sampleBEFORE.tex @@ -0,0 +1,5819 @@ +% arara: indent: {overwrite: true, trace: on} +% A sample chapter file- it contains a lot of +% environments, including tabulars, align, etc +% +% Don't try and compile this file using pdflatex etc, just +% compare the *format* of it to the format of the +% sampleAFTER.tex +% +% In particular, compare the tabular and align-type +% environments before and after running the script + +\section{Polynomial functions} + \reformatstepslist{P} % the steps list should be P1, P2, \ldots + In your previous mathematics classes you have studied \emph{linear} and + \emph{quadratic} functions. The most general forms of these types of + functions can be represented (respectively) by the functions $f$ + and $g$ that have formulas + \begin{equation}\label{poly:eq:linquad} + f(x)=mx+b, \qquad g(x)=ax^2+bx+c + \end{equation} + We know that $m$ is the slope of $f$, and that $a$ is the \emph{leading coefficient} + of $g$. We also know that the \emph{signs} of $m$ and $a$ completely + determine the behavior of the functions $f$ and $g$. For example, if $m>0$ + then $f$ is an \emph{increasing} function, and if $m<0$ then $f$ is + a \emph{decreasing} function. Similarly, if $a>0$ then $g$ is + \emph{concave up} and if $a<0$ then $g$ is \emph{concave down}. Graphical + representations of these statements are given in \cref{poly:fig:linquad}. + + \begin{figure}[!htb] + \setlength{\figurewidth}{.2\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-10:8]{(x+2)}; + \end{axis} + \end{tikzpicture} + \caption{$m>0$} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-10:8]{-(x+2)}; + \end{axis} + \end{tikzpicture} + \caption{$m<0$} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-4:4]{(x^2-6)}; + \end{axis} + \end{tikzpicture} + \caption{$a>0$} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-4:4]{-(x^2-6)}; + \end{axis} + \end{tikzpicture} + \caption{$a<0$} + \end{subfigure} + \caption{Typical graphs of linear and quadratic functions.} + \label{poly:fig:linquad} + \end{figure} + + Let's look a little more closely at the formulas for $f$ and $g$ in + \cref{poly:eq:linquad}. Note that the \emph{degree} + of $f$ is $1$ since the highest power of $x$ that is present in the + formula for $f(x)$ is $1$. Similarly, the degree of $g$ is $2$ since + the highest power of $x$ that is present in the formula for $g(x)$ + is $2$. + + In this section we will build upon our knowledge of these elementary + functions. In particular, we will generalize the functions $f$ and $g$ to a function $p$ that has + any degree that we wish. + + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{essentialskills} + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{problem}[Quadratic functions] + Every quadratic function has the form $y=ax^2+bx+c$; state the value + of $a$ for each of the following functions, and hence decide if the + parabola that represents the function opens upward or downward. + \begin{multicols}{2} + \begin{subproblem} + $F(x)=x^2+3$ + \begin{shortsolution} + $a=1$; the parabola opens upward. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $G(t)=4-5t^2$ + \begin{shortsolution} + $a=-5$; the parabola opens downward. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $H(y)=4y^2-96y+8$ + \begin{shortsolution} + $a=4$; the parabola opens upward. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $K(z)=-19z^2$ + \begin{shortsolution} + $m=-19$; the parabola opens downward. + \end{shortsolution} + \end{subproblem} + \end{multicols} + Now let's generalize our findings for the most general quadratic function $g$ + that has formula $g(x)=a_2x^2+a_1x+a_0$. Complete the following sentences. + \begin{subproblem} + When $a_2>0$, the parabola that represents $y=g(x)$ opens $\ldots$ + \begin{shortsolution} + When $a_2>0$, the parabola that represents the function opens upward. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + When $a_2<0$, the parabola that represents $y=g(x)$ opens $\ldots$ + \begin{shortsolution} + When $a_2<0$, the parabola that represents the function opens downward. + \end{shortsolution} + \end{subproblem} + \end{problem} + \end{essentialskills} + + \subsection*{Power functions with positive exponents} + The study of polynomials will rely upon a good knowledge + of power functions| you may reasonably ask, what is a power function? + \begin{pccdefinition}[Power functions] + Power functions have the form + \[ + f(x) = a_n x^n + \] + where $n$ can be any real number. + + Note that for this section we will only be concerned with the + case when $n$ is a positive integer. + \end{pccdefinition} + + You may find assurance in the fact that you are already very comfortable + with power functions that have $n=1$ (linear) and $n=2$ (quadratic). Let's + explore some power functions that you might not be so familiar with. + As you read \cref{poly:ex:oddpow,poly:ex:evenpow}, try and spot + as many patterns and similarities as you can. + + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{pccexample}[Power functions with odd positive exponents] + \label{poly:ex:oddpow} + Graph each of the following functions, state their domain, and their + long-run behavior as $x\rightarrow\pm\infty$ + \[ + f(x)=x^3, \qquad g(x)=x^5, \qquad h(x)=x^7 + \] + \begin{pccsolution} + The functions $f$, $g$, and $h$ are plotted in \cref{poly:fig:oddpow}. + The domain of each of the functions $f$, $g$, and $h$ is $(-\infty,\infty)$. Note that + the long-run behavior of each of the functions is the same, and in particular + \begin{align*} + f(x)\rightarrow\infty & \text{ as } x\rightarrow\infty \\ + \mathllap{\text{and }} f(x)\rightarrow-\infty & \text{ as } x\rightarrow-\infty + \end{align*} + The same results hold for $g$ and $h$. + \end{pccsolution} + \end{pccexample} + + \begin{figure}[!htb] + \begin{minipage}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-1.5,xmax=1.5, + ymin=-5,ymax=5, + xtick={-1.0,-0.5,...,1.0}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\textwidth, + legend pos=north west, + ] + \addplot expression[domain=-1.5:1.5]{x^3}; + \addplot expression[domain=-1.379:1.379]{x^5}; + \addplot expression[domain=-1.258:1.258]{x^7}; + \addplot[soldot]coordinates{(-1,-1)} node[axisnode,anchor=north west]{$(-1,-1)$}; + \addplot[soldot]coordinates{(1,1)} node[axisnode,anchor=south east]{$(1,1)$}; + \legend{$f$,$g$,$h$} + \end{axis} + \end{tikzpicture} + \caption{Odd power functions} + \label{poly:fig:oddpow} + \end{minipage}% + \hfill + \begin{minipage}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-2.5,xmax=2.5, + ymin=-5,ymax=5, + xtick={-2.0,-1.5,...,2.0}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\textwidth, + legend pos=south east, + ] + \addplot expression[domain=-2.236:2.236]{x^2}; + \addplot expression[domain=-1.495:1.495]{x^4}; + \addplot expression[domain=-1.307:1.307]{x^6}; + \addplot[soldot]coordinates{(-1,1)} node[axisnode,anchor=east]{$(-1,1)$}; + \addplot[soldot]coordinates{(1,1)} node[axisnode,anchor=west]{$(1,1)$}; + \legend{$F$,$G$,$H$} + \end{axis} + \end{tikzpicture} + \caption{Even power functions} + \label{poly:fig:evenpow} + \end{minipage}% + \end{figure} + + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{pccexample}[Power functions with even positive exponents]\label{poly:ex:evenpow}% + Graph each of the following functions, state their domain, and their + long-run behavior as $x\rightarrow\pm\infty$ + \[ + F(x)=x^2, \qquad G(x)=x^4, \qquad H(x)=x^6 + \] + \begin{pccsolution} + The functions $F$, $G$, and $H$ are plotted in \cref{poly:fig:evenpow}. The domain + of each of the functions is $(-\infty,\infty)$. Note that the long-run behavior + of each of the functions is the same, and in particular + \begin{align*} + F(x)\rightarrow\infty & \text{ as } x\rightarrow\infty \\ + \mathllap{\text{and }} F(x)\rightarrow\infty & \text{ as } x\rightarrow-\infty + \end{align*} + The same result holds for $G$ and $H$. + \end{pccsolution} + \end{pccexample} + + \begin{doyouunderstand} + \begin{problem} + Repeat \cref{poly:ex:oddpow,poly:ex:evenpow} using (respectively) + \begin{subproblem} + $f(x)=-x^3, \qquad g(x)=-x^5, \qquad h(x)=-x^7$ + \begin{shortsolution} + The functions $f$, $g$, and $h$ have domain $(-\infty,\infty)$ and + are graphed below. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-1.5,xmax=1.5, + ymin=-5,ymax=5, + xtick={-1.0,-0.5,...,0.5}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\solutionfigurewidth, + legend pos=north east, + ] + \addplot expression[domain=-1.5:1.5]{-x^3}; + \addplot expression[domain=-1.379:1.379]{-x^5}; + \addplot expression[domain=-1.258:1.258]{-x^7}; + \legend{$f$,$g$,$h$} + \end{axis} + \end{tikzpicture} + + Note that + \begin{align*} + f(x)\rightarrow-\infty & \text{ as } x\rightarrow\infty \\ + \mathllap{\text{and }} f(x)\rightarrow\infty & \text{ as } x\rightarrow-\infty + \end{align*} + The same is true for $g$ and $h$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $F(x)=-x^2, \qquad G(x)=-x^4, \qquad H(x)=-x^6$ + \begin{shortsolution} + The functions $F$, $G$, and $H$ have domain $(-\infty,\infty)$ and + are graphed below. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-2.5,xmax=2.5, + ymin=-5,ymax=5, + xtick={-1.0,-0.5,...,0.5}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\solutionfigurewidth, + legend pos=north east, + ] + \addplot expression[domain=-2.236:2.236]{-x^2}; + \addplot expression[domain=-1.495:1.495]{-x^4}; + \addplot expression[domain=-1.307:1.307]{-x^6}; + \legend{$F$,$G$,$H$} + \end{axis} + \end{tikzpicture} + + Note that + \begin{align*} + F(x)\rightarrow-\infty & \text{ as } x\rightarrow\infty \\ + \mathllap{\text{and }} F(x)\rightarrow-\infty & \text{ as } x\rightarrow-\infty + \end{align*} + The same is true for $G$ and $H$. + \end{shortsolution} + \end{subproblem} + \end{problem} + \end{doyouunderstand} + + \subsection*{Polynomial functions} + Now that we have a little more familiarity with power functions, + we can define polynomial functions. Provided that you were comfortable + with our opening discussion about linear and quadratic functions (see + $f$ and $g$ in \cref{poly:eq:linquad}) then there is every chance + that you'll be able to master polynomial functions as well; just remember + that polynomial functions are a natural generalization of linear + and quadratic functions. Once you've studied the examples and problems + in this section, you'll hopefully agree that polynomial functions + are remarkably predictable. + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{pccdefinition}[Polynomial functions] + Polynomial functions have the form + \[ + p(x)=a_nx^n+a_{n-1}x^{n-1}+\ldots+a_1x+a_0 + \] + where $a_n$, $a_{n-1}$, $a_{n-2}$, \ldots, $a_0$ are real numbers. + \begin{itemize} + \item We call $n$ the degree of the polynomial, and require that $n$ + is a non-negative integer; + \item $a_n$, $a_{n-1}$, $a_{n-2}$, \ldots, $a_0$ are called the coefficients; + \item We typically write polynomial functions in descending powers of $x$. + \end{itemize} + In particular, we call $a_n$ the \emph{leading} coefficient, and $a_nx^n$ the + \emph{leading term}. + + Note that if a polynomial is given in factored form, then the degree can be found + by counting the number of linear factors. + \end{pccdefinition} + + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{pccexample}[Polynomial or not] + Identify the following functions as polynomial or not; if the function + is a polynomial, state its degree. + \begin{multicols}{3} + \begin{enumerate} + \item $p(x)=x^2-3$ + \item $q(x)=-4x^{\nicefrac{1}{2}}+10$ + \item $r(x)=10x^5$ + \item $s(x)=x^{-2}+x^{23}$ + \item $f(x)=-8$ + \item $g(x)=3^x$ + \item $h(x)=\sqrt[3]{x^7}-x^2+x$ + \item $k(x)=4x(x+2)(x-3)$ + \item $j(x)=x^2(x-4)(5-x)$ + \end{enumerate} + \end{multicols} + \begin{pccsolution} + \begin{enumerate} + \item $p$ is a polynomial, and its degree is $2$. + \item $q$ is \emph{not} a polynomial, because $\frac{1}{2}$ is not an integer. + \item $r$ is a polynomial, and its degree is $5$. + \item $s$ is \emph{not} a polynomial, because $-2$ is not a positive integer. + \item $f$ is a polynomial, and its degree is $0$. + \item $g$ is \emph{not} a polynomial, because the independent + variable, $x$, is in the exponent. + \item $h$ is \emph{not} a polynomial, because $\frac{7}{3}$ is not an integer. + \item $k$ is a polynomial, and its degree is $3$. + \item $j$ is a polynomial, and its degree is $4$. + \end{enumerate} + \end{pccsolution} + \end{pccexample} + + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{pccexample}[Typical graphs]\label{poly:ex:typical} + \Cref{poly:fig:typical} shows graphs of some polynomial functions; + the ticks have deliberately been left off the axis to allow us to concentrate + on the features of each graph. Note in particular that: + \begin{itemize} + \item \cref{poly:fig:typical1} shows a degree-$1$ polynomial (you might also + classify the function as linear) whose leading coefficient, $a_1$, is positive. + \item \cref{poly:fig:typical2} shows a degree-$2$ polynomial (you might also + classify the function as quadratic) whose leading coefficient, $a_2$, is positive. + \item \cref{poly:fig:typical3} shows a degree-$3$ polynomial whose leading coefficient, $a_3$, + is positive| compare its overall + shape and long-run behavior to the functions described in \cref{poly:ex:oddpow}. + \item \cref{poly:fig:typical4} shows a degree-$4$ polynomial whose leading coefficient, $a_4$, + is positive|compare its overall shape and long-run behavior to the functions described in \cref{poly:ex:evenpow}. + \item \cref{poly:fig:typical5} shows a degree-$5$ polynomial whose leading coefficient, $a_5$, + is positive| compare its overall + shape and long-run behavior to the functions described in \cref{poly:ex:oddpow}. + \end{itemize} + \end{pccexample} + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{figure}[!htb] + \begin{widepage} + \setlength{\figurewidth}{\textwidth/6} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-10:8]{(x+2)}; + \end{axis} + \end{tikzpicture} + \caption{$a_1>0$} + \label{poly:fig:typical1} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-4:4]{(x^2-6)}; + \end{axis} + \end{tikzpicture} + \caption{$a_2>0$} + \label{poly:fig:typical2} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-7.5:7.5]{0.05*(x+6)*x*(x-6)}; + \end{axis} + \end{tikzpicture} + \caption{$a_3>0$} + \label{poly:fig:typical3} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-2.35:5.35,samples=100]{0.2*(x-5)*x*(x-3)*(x+2)}; + \end{axis} + \end{tikzpicture} + \caption{$a_4>0$} + \label{poly:fig:typical4} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\textwidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-5.5:6.3,samples=100]{0.01*(x+2)*x*(x-3)*(x+5)*(x-6)}; + \end{axis} + \end{tikzpicture} + \caption{$a_5>0$} + \label{poly:fig:typical5} + \end{subfigure} + \end{widepage} + \caption{Graphs to illustrate typical curves of polynomial functions.} + \label{poly:fig:typical} + \end{figure} + + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{doyouunderstand} + \begin{problem} + Use \cref{poly:ex:typical} and \cref{poly:fig:typical} to help you sketch + the graphs of polynomial functions that have negative leading coefficients| note + that there are many ways to do this! The intention with this problem + is to use your knowledge of transformations- in particular, \emph{reflections}- + to guide you. + \begin{shortsolution} + $a_1<0$: + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\solutionfigurewidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-10:8]{-(x+2)}; + \end{axis} + \end{tikzpicture} + + $a_2<0$ + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\solutionfigurewidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-4:4]{-(x^2-6)}; + \end{axis} + \end{tikzpicture} + + $a_3<0$ + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\solutionfigurewidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-7.5:7.5]{-0.05*(x+6)*x*(x-6)}; + \end{axis} + \end{tikzpicture} + + $a_4<0$ + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\solutionfigurewidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-2.35:5.35,samples=100]{-0.2*(x-5)*x*(x-3)*(x+2)}; + \end{axis} + \end{tikzpicture} + + $a_5<0$ + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + width=\solutionfigurewidth, + xtick={-11}, + ytick={-11}, + ] + \addplot expression[domain=-5.5:6.3,samples=100]{-0.01*(x+2)*x*(x-3)*(x+5)*(x-6)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{problem} + \end{doyouunderstand} + + \fixthis{poly: Need a more basic example here- it can have a similar + format to the multiple zeros example, but just keep it simple; it should + be halfway between the 2 examples surrounding it} + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{pccexample}[Multiple zeros] + Consider the polynomial functions $p$, $q$, and $r$ which are + graphed in \cref{poly:fig:moremultiple}. + The formulas for $p$, $q$, and $r$ are as follows + \begin{align*} + p(x) & =(x-3)^2(x+4)^2 \\ + q(x) & =x(x+2)^2(x-1)^2(x-3) \\ + r(x) & =x(x-3)^3(x+1)^2 + \end{align*} + Find the degree of $p$, $q$, and $r$, and decide if the functions bounce off or cut + through the horizontal axis at each of their zeros. + \begin{pccsolution} + The degree of $p$ is 4. Referring to \cref{poly:fig:bouncep}, + the curve bounces off the horizontal axis at both zeros, $3$ and $4$. + + The degree of $q$ is 6. Referring to \cref{poly:fig:bounceq}, + the curve bounces off the horizontal axis at $-2$ and $1$, and cuts + through the horizontal axis at $0$ and $3$. + + The degree of $r$ is 6. Referring to \cref{poly:fig:bouncer}, + the curve bounces off the horizontal axis at $-1$, and cuts through + the horizontal axis at $0$ and at $3$, although is flattened immediately to the left and right of $3$. + \end{pccsolution} + \end{pccexample} + + \setlength{\figurewidth}{0.25\textwidth} + \begin{figure}[!htb] + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-6,xmax=5, + ymin=-30,ymax=200, + xtick={-4,-2,...,4}, + width=\textwidth, + ] + \addplot expression[domain=-5.63733:4.63733,samples=50]{(x-3)^2*(x+4)^2}; + \addplot[soldot]coordinates{(3,0)(-4,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=p(x)$} + \label{poly:fig:bouncep} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-3,xmax=4, + xtick={-2,...,3}, + ymin=-60,ymax=40, + width=\textwidth, + ] + \addplot+[samples=50] expression[domain=-2.49011:3.11054]{x*(x+2)^2*(x-1)^2*(x-3)}; + \addplot[soldot]coordinates{(-2,0)(0,0)(1,0)(3,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=q(x)$} + \label{poly:fig:bounceq} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-2,xmax=4, + xtick={-1,...,3}, + ymin=-40,ymax=40, + width=\textwidth, + ] + \addplot expression[domain=-1.53024:3.77464,samples=50]{x*(x-3)^3*(x+1)^2}; + \addplot[soldot]coordinates{(-1,0)(0,0)(3,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=r(x)$} + \label{poly:fig:bouncer} + \end{subfigure} + \caption{} + \label{poly:fig:moremultiple} + \end{figure} + + \begin{pccdefinition}[Multiple zeros]\label{poly:def:multzero} + Let $p$ be a polynomial that has a repeated linear factor $(x-a)^n$. Then we say + that $p$ has a multiple zero at $a$ of multiplicity $n$ and + \begin{itemize} + \item if the factor $(x-a)$ is repeated an even number of times, the graph of $y=p(x)$ does not + cross the $x$ axis at $a$, but `bounces' off the horizontal axis at $a$. + \item if the factor $(x-a)$ is repeated an odd number of times, the graph of $y=p(x)$ crosses the + horizontal axis at $a$, but it looks `flattened' there + \end{itemize} + If $n=1$, then we say that $p$ has a \emph{simple} zero at $a$. + \end{pccdefinition} + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{pccexample}[Find a formula] + Find formulas for the polynomial functions, $p$ and $q$, graphed in \cref{poly:fig:findformulademoboth}. + \begin{figure}[!htb] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[framed, + xmin=-5,xmax=5, + ymin=-10,ymax=10, + xtick={-4,-2,...,4}, + minor xtick={-3,-1,...,3}, + ytick={-8,-6,...,8}, + width=\textwidth, + grid=both] + \addplot expression[domain=-3.25842:2.25842,samples=50]{-x*(x-2)*(x+3)*(x+1)}; + \addplot[soldot]coordinates{(1,8)}node[axisnode,inner sep=.35cm,anchor=west]{$(1,8)$}; + \addplot[soldot]coordinates{(-3,0)(-1,0)(0,0)(2,0)}; + \end{axis} + \end{tikzpicture} + \caption{$p$} + \label{poly:fig:findformulademo} + \end{subfigure} + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[framed, + xmin=-5,xmax=5, + ymin=-10,ymax=10, + xtick={-4,-2,...,4}, + minor xtick={-3,-1,...,3}, + ytick={-8,-6,...,8}, + width=\textwidth, + grid=both] + \addplot expression[domain=-4.33:4.08152]{-.25*(x+2)^2*(x-3)}; + \addplot[soldot]coordinates{(2,4)}node[axisnode,anchor=south west]{$(2,4)$}; + \addplot[soldot]coordinates{(-2,0)(3,0)}; + \end{axis} + \end{tikzpicture} + \caption{$q$} + \label{poly:fig:findformulademo1} + \end{subfigure} + \caption{} + \label{poly:fig:findformulademoboth} + \end{figure} + \begin{pccsolution} + \begin{enumerate} + \item We begin by noting that the horizontal intercepts of $p$ are $(-3,0)$, $(-1,0)$, $(0,0)$ and $(2,0)$. + We also note that each zero is simple (multiplicity $1$). + If we assume that $p$ has no other zeros, then we can start by writing + \begin{align*} + p(x) & =(x+3)(x+1)(x-0)(x-2) \\ + & =x(x+3)(x+1)(x-2) \\ + \end{align*} + According to \cref{poly:fig:findformulademo}, the point $(1,8)$ lies + on the curve $y=p(x)$. + Let's check if the formula we have written satisfies this requirement + \begin{align*} + p(1) & = (1)(4)(2)(-1) \\ + & = -8 + \end{align*} + which is clearly not correct| it is close though. We can correct this by + multiplying $p$ by a constant $k$; so let's assume that + \[ + p(x)=kx(x+3)(x+1)(x-2) + \] + Then $p(1)=-8k$, and if this is to equal $8$, then $k=-1$. Therefore + the formula for $p(x)$ is + \[ + p(x)=-x(x+3)(x+1)(x-2) + \] + \item The function $q$ has a zero at $-2$ of multiplicity $2$, and zero of + multiplicity $1$ at $3$ (so $3$ is a simple zero of $q$); we can therefore assume that $q$ has the form + \[ + q(x)=k(x+2)^2(x-3) + \] + where $k$ is some real number. In order to find $k$, we use the given ordered pair, $(2,4)$, and + evaluate $p(2)$ + \begin{align*} + p(2) & =k(4)^2(-1) \\ + & =-16k + \end{align*} + We solve the equation $4=-8k$ and obtain $k=-\frac{1}{4}$ and conclude that the + formula for $q(x)$ is + \[ + q(x)=-\frac{1}{4}(x+2)^2(x-3) + \] + \end{enumerate} + \end{pccsolution} + \end{pccexample} + + + \fixthis{Chris: need sketching polynomial problems} + \begin{pccspecialcomment}[Steps to follow when sketching polynomial functions] + \begin{steps} + \item \label{poly:step:first} Determine the degree of the polynomial, + its leading term and leading coefficient, and hence determine + the long-run behavior of the polynomial| does it behave like $\pm x^2$ or $\pm x^3$ + as $x\rightarrow\pm\infty$? + \item Determine the zeros and their multiplicity. Mark all zeros + and the vertical intercept on the graph using solid circles $\bullet$. + \item \label{poly:step:last} Deduce the overall shape of the curve, and sketch it. If there isn't + enough information from the previous steps, then construct a table of values. + \end{steps} + Remember that until we have the tools of calculus, we won't be able to + find the exact coordinates of local minimums, local maximums, and points + of inflection. + \end{pccspecialcomment} + Before we demonstrate some examples, it is important to remember the following: + \begin{itemize} + \item our sketches will give a good representation of the overall + shape of the graph, but until we have the tools of calculus (from MTH 251) + we can not find local minimums, local maximums, and inflection points algebraically. This + means that we will make our best guess as to where these points are. + \item we will not concern ourselves too much with the vertical scale (because of + our previous point)| we will, however, mark the vertical intercept (assuming there is one), + and any horizontal asymptotes. + \end{itemize} + %=================================== + % Author: Hughes + % Date: May 2012 + %=================================== + \begin{pccexample}\label{poly:ex:simplecubic} + Use \crefrange{poly:step:first}{poly:step:last} to sketch a graph of the function $p$ + that has formula + \[ + p(x)=\frac{1}{2}(x-4)(x-1)(x+3) + \] + \begin{pccsolution} + \begin{steps} + \item $p$ has degree $3$. The leading term of $p$ is $\frac{1}{2}x^3$, so the leading coefficient of $p$ + is $\frac{1}{2}$. The long-run behavior of $p$ is therefore similar to that of $x^3$. + \item The zeros of $p$ are $-3$, $1$, and $4$; each zero is simple (i.e, it has multiplicity $1$). + This means that the curve of $p$ cuts the horizontal axis at each zero. The vertical + intercept of $p$ is $(0,6)$. + \item We draw the details we have obtained so far on \cref{poly:fig:simplecubicp1}. Given + that the curve of $p$ looks like the curve of $x^3$ in the long-run, we are able to complete a sketch of the + graph of $p$ in \cref{poly:fig:simplecubicp2}. + + Note that we can not find the coordinates of the local minimums, local maximums, and inflection + points| for the moment we make reasonable guesses as to where these points are (you'll find how + to do this in calculus). + \end{steps} + + \begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=15, + xtick={-8,-6,...,8}, + ytick={-5,5}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-3,0)(1,0)(4,0)(0,6)}node[axisnode,anchor=south west]{$(0,6)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:simplecubicp1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=15, + xtick={-8,-6,...,8}, + ytick={-5,5}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-3,0)(1,0)(4,0)(0,6)}node[axisnode,anchor=south west]{$(0,6)$}; + \addplot[pccplot] expression[domain=-3.57675:4.95392,samples=100]{.5*(x-4)*(x-1)*(x+3)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:simplecubicp2} + \end{subfigure}% + \caption{$y=\dfrac{1}{2}(x-4)(x-1)(x+3)$} + \label{poly:fig:simplecubic} + \end{figure} + \end{pccsolution} + \end{pccexample} + + %=================================== + % Author: Hughes + % Date: May 2012 + %=================================== + \begin{pccexample}\label{poly:ex:degree5} + Use \crefrange{poly:step:first}{poly:step:last} to sketch a graph of the function $q$ + that has formula + \[ + q(x)=\frac{1}{200}(x+7)^2(2-x)(x-6)^2 + \] + \begin{pccsolution} + \begin{steps} + \item $q$ has degree $4$. The leading term of $q$ is + \[ + -\frac{1}{200}x^5 + \] + so the leading coefficient of $q$ is $-\frac{1}{200}$. The long-run behavior of $q$ + is therefore similar to that of $-x^5$. + \item The zeros of $q$ are $-7$ (multiplicity 2), $2$ (simple), and $6$ (multiplicity $2$). + The curve of $q$ bounces off the horizontal axis at the zeros with multiplicity $2$ and + cuts the horizontal axis at the simple zeros. The vertical intercept of $q$ is $\left( 0,\frac{441}{25} \right)$. + \item We mark the details we have found so far on \cref{poly:fig:degree5p1}. Given that + the curve of $q$ looks like the curve of $-x^5$ in the long-run, we can complete \cref{poly:fig:degree5p2}. + \end{steps} + + \begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=40, + xtick={-8,-6,...,8}, + ytick={-5,0,...,35}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-7,0)(2,0)(6,0)(0,441/25)}node[axisnode,anchor=south west]{$\left( 0, \frac{441}{25} \right)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:degree5p1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=40, + xtick={-8,-6,...,8}, + ytick={-5,0,...,35}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-7,0)(2,0)(6,0)(0,441/25)}node[axisnode,anchor=south west]{$\left( 0, \frac{441}{25} \right)$}; + \addplot[pccplot] expression[domain=-8.83223:7.34784,samples=50]{1/200*(x+7)^2*(2-x)*(x-6)^2}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:degree5p2} + \end{subfigure}% + \caption{$y=\dfrac{1}{200}(x+7)^2(2-x)(x-6)^2$} + \label{poly:fig:degree5} + \end{figure} + \end{pccsolution} + \end{pccexample} + + %=================================== + % Author: Hughes + % Date: May 2012 + %=================================== + \begin{pccexample} + Use \crefrange{poly:step:first}{poly:step:last} to sketch a graph of the function $r$ + that has formula + \[ + r(x)=\frac{1}{100}x^3(x+4)(x-4)(x-6) + \] + \begin{pccsolution} + \begin{steps} + \item $r$ has degree $6$. The leading term of $r$ is + \[ + \frac{1}{100}x^6 + \] + so the leading coefficient of $r$ is $\frac{1}{100}$. The long-run behavior of $r$ + is therefore similar to that of $x^6$. + \item The zeros of $r$ are $-4$ (simple), $0$ (multiplicity $3$), $4$ (simple), + and $6$ (simple). The vertical intercept of $r$ is $(0,0)$. The curve of $r$ + cuts the horizontal axis at the simple zeros, and goes through the axis + at $(0,0)$, but does so in a flattened way. + \item We mark the zeros and vertical intercept on \cref{poly:fig:degree6p1}. Given that + the curve of $r$ looks like the curve of $x^6$ in the long-run, we complete the graph + of $r$ in \cref{poly:fig:degree6p2}. + \end{steps} + + \begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=10, + ymin=-20,ymax=10, + xtick={-4,-2,...,8}, + ytick={-15,-10,...,5}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-4,0)(0,0)(4,0)(6,0)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:degree6p1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=10, + ymin=-20,ymax=10, + xtick={-4,-2,...,8}, + ytick={-15,-10,...,5}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-4,0)(0,0)(4,0)(6,0)}; + \addplot[pccplot] expression[domain=-4.16652:6.18911,samples=100]{1/100*(x+4)*x^3*(x-4)*(x-6)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:degree6p2} + \end{subfigure}% + \caption{$y=\dfrac{1}{100}(x+4)x^3(x-4)(x-6)$} + \end{figure} + \end{pccsolution} + \end{pccexample} + + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{pccexample}[An open-topped box] + A cardboard company makes open-topped boxes for their clients. The specifications + dictate that the box must have a square base, and that it must be open-topped. + The company uses sheets of cardboard that are $\unit[1200]{cm^2}$. Assuming that + the base of each box has side $x$ (measured in cm), it can be shown that the volume of each box, $V(x)$, + has formula + \[ + V(x)=\frac{x}{4}(1200-x^2) + \] + Find the dimensions of the box that maximize the volume. + \begin{pccsolution} + We graph $y=V(x)$ in \cref{poly:fig:opentoppedbox}. Note that because + $x$ represents the length of a side, and $V(x)$ represents the volume + of the box, we necessarily require both values to be positive; we illustrate + the part of the curve that applies to this problem using a solid line. + + \begin{figure}[!htb] + \centering + \begin{tikzpicture} + \begin{axis}[framed, + xmin=-50,xmax=50, + ymin=-5000,ymax=5000, + xtick={-40,-30,...,40}, + minor xtick={-45,-35,...,45}, + minor ytick={-3000,-1000,1000,3000}, + width=.75\textwidth, + height=.5\textwidth, + grid=both] + \addplot[pccplot,dashed,<-] expression[domain=-40:0,samples=50]{x/4*(1200-x^2)}; + \addplot[pccplot,-] expression[domain=0:34.64,samples=50]{x/4*(1200-x^2)}; + \addplot[pccplot,dashed,->] expression[domain=34.64:40,samples=50]{x/4*(1200-x^2)}; + \addplot[soldot] coordinates{(20,4000)}; + \end{axis} + \end{tikzpicture} + \caption{$y=V(x)$} + \label{poly:fig:opentoppedbox} + \end{figure} + + According to \cref{poly:fig:opentoppedbox}, the maximum volume of such a box is + approximately $\unit[4000]{cm^2}$, and we achieve it using a base of length + approximately $\unit[20]{cm}$. Since the base is square and each sheet of cardboard + is $\unit[1200]{cm^2}$, we conclude that the dimensions of each box are $\unit[20]{cm}\times\unit[20]{cm}\times\unit[30]{cm}$. + \end{pccsolution} + \end{pccexample} + + \subsection*{Complex zeros} + There has been a pattern to all of the examples that we have seen so far| + the degree of the polynomial has dictated the number of \emph{real} zeros that the + polynomial has. For example, the function $p$ in \cref{poly:ex:simplecubic} + has degree $3$, and $p$ has $3$ real zeros; the function $q$ in \cref{poly:ex:degree5} + has degree $5$ and $q$ has $5$ real zeros. + + You may wonder if this result can be generalized| does every polynomial that + has degree $n$ have $n$ real zeros? Before we tackle the general result, + let's consider an example that may help motivate it. + %=================================== + % Author: Hughes + % Date: June 2012 + %=================================== + \begin{pccexample}\label{poly:ex:complx} + Consider the polynomial function $c$ that has formula + \[ + c(x)=x(x^2+1) + \] + It is clear that $c$ has degree $3$, and that $c$ has a (simple) zero at $0$. Does + $c$ have any other zeros, i.e, can we find any values of $x$ that satisfy the equation + \begin{equation}\label{poly:eq:complx} + x^2+1=0 + \end{equation} + The solutions to \cref{poly:eq:complx} are $\pm i$. + + We conclude that $c$ has $3$ zeros: $0$ and $\pm i$; we note that \emph{not + all of them are real}. + \end{pccexample} + \Cref{poly:ex:complx} shows that not every degree-$3$ polynomial has $3$ + \emph{real} zeros; however, if we are prepared to venture into the complex numbers, + then we can state the following theorem. + %=================================== + % Author: Hughes + % Date: June 2012 + %=================================== + \begin{pccspecialcomment}[The fundamental theorem of algebra] + Every polynomial function of degree $n$ has $n$ roots, some of which may + be complex, and some may be repeated. + \end{pccspecialcomment} + \fixthis{Fundamental theorem of algebra: is this wording ok? do we want + it as a theorem?} + %=================================== + % Author: Hughes + % Date: June 2012 + %=================================== + \begin{pccexample} + Find all the zeros of the polynomial function $p$ that has formula + \[ + p(x)=x^4-2x^3+5x^2 + \] + \begin{pccsolution} + We begin by factoring $p$ + \begin{align*} + p(x) & =x^4-2x^3+5x^2 \\ + & =x^2(x^2-2x+5) + \end{align*} + We note that $0$ is a zero of $p$ with multiplicity $2$. The other zeros of $p$ + can be found by solving the equation + \[ + x^2-2x+5=0 + \] + This equation can not be factored, so we use the quadratic formula + \begin{align*} + x & =\frac{2\pm\sqrt{(-2)^2}-20}{2(1)} \\ + & =\frac{2\pm\sqrt{-16}}{2} \\ + & =1\pm 2i + \end{align*} + We conclude that $p$ has $4$ zeros: $0$ (multiplicity $2$), and $1\pm 2i$ (simple). + \end{pccsolution} + \end{pccexample} + %=================================== + % Author: Hughes + % Date: June 2012 + %=================================== + \begin{pccexample} + Find a polynomial that has zeros at $2\pm i\sqrt{2}$. + \begin{pccsolution} + We know that the zeros of a polynomial can be found by analyzing the linear + factors. We are given the zeros, and have to work backwards to find the + linear factors. + + We begin by assuming that $p$ has the form + \begin{align*} + p(x) & =(x-(2-i\sqrt{2}))(x-(2+i\sqrt{2})) \\ + & =x^2-x(2+i\sqrt{2})-x(2-i\sqrt{2})+(2-i\sqrt{2})(2+i\sqrt{2}) \\ + & =x^2-4x+(4-2i^2) \\ + & =x^2-4x+6 + \end{align*} + We conclude that a possible formula for a polynomial function, $p$, + that has zeros at $2\pm i\sqrt{2}$ is + \[ + p(x)=x^2-4x+6 + \] + Note that we could multiply $p$ by any real number and still ensure + that $p$ has the same zeros. + \end{pccsolution} + \end{pccexample} + \investigation*{} + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{problem}[Find a formula from a graph] + For each of the polynomials in \cref{poly:fig:findformula} + \begin{enumerate} + \item count the number of times the curve turns round, and cuts/bounces off the $x$ axis; + \item approximate the degree of the polynomial; + \item use your information to find the linear factors of each polynomial, and therefore write a possible formula for each; + \item make sure your polynomial goes through the given ordered pair. + \end{enumerate} + \begin{shortsolution} + \Vref{poly:fig:findformdeg2}: + \begin{enumerate} + \item the curve turns round once; + \item the degree could be 2; + \item based on the zeros, the linear factors are $(x+5)$ and $(x-3)$; since the + graph opens downwards, we will assume the leading coefficient is negative: $p(x)=-k(x+5)(x-3)$; + \item $p$ goes through $(2,2)$, so we need to solve $2=-k(7)(-1)$ and therefore $k=\nicefrac{2}{7}$, so + \[ + p(x)=-\frac{2}{7}(x+5)(x-3) + \] + \end{enumerate} + \Vref{poly:fig:findformdeg3}: + \begin{enumerate} + \item the curve turns around twice; + \item the degree could be 3; + \item based on the zeros, the linear factors are $(x+2)^2$, and $(x-1)$; + based on the behavior of $p$, we assume that the leading coefficient is positive, and try $p(x)=k(x+2)^2(x-1)$; + \item $p$ goes through $(0,-2)$, so we need to solve $-2=k(4)(-1)$ and therefore $k=\nicefrac{1}{2}$, so + \[ + p(x)=\frac{1}{2}(x+2)^2(x-1) + \] + \end{enumerate} + \Vref{poly:fig:findformdeg5}: + \begin{enumerate} + \item the curve turns around 4 times; + \item the degree could be 5; + \item based on the zeros, the linear factors are $(x+5)^2$, $(x+1)$, $(x-2)$, $(x-3)$; + based on the behavior of $p$, we assume that the leading coefficient is positive, and try $p(x)=k(x+5)^2(x+1)(x-2)(x-3)$; + \item $p$ goes through $(-3,-50)$, so we need to solve $-50=k(64)(-2)(-5)(-6)$ and therefore $k=\nicefrac{5}{384}$, so + \[ + p(x)=\frac{5}{384}(x+5)^2(x+1)(x-2)(x-3) + \] + \end{enumerate} + \end{shortsolution} + \end{problem} + + + \begin{figure}[!htb] + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-2,ymax=5, + width=\textwidth, + ] + \addplot expression[domain=-4.5:3.75]{-1/3*(x+4)*(x-3)}; + \addplot[soldot] coordinates{(-4,0)(3,0)(2,2)} node[axisnode,above right]{$(2,2)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:findformdeg2} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-3,xmax=2, + ymin=-2,ymax=4, + xtick={-2,...,1}, + width=\textwidth, + ] + \addplot expression[domain=-2.95:1.75]{1/3*(x+2)^2*(x-1)}; + \addplot[soldot]coordinates{(-2,0)(1,0)(0,-1.33)}node[axisnode,anchor=north west]{$(0,-2)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:findformdeg3} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-100,ymax=150, + width=\textwidth, + ] + \addplot expression[domain=-4.5:3.4,samples=50]{(x+4)^2*(x+1)*(x-2)*(x-3)}; + \addplot[soldot]coordinates{(-4,0)(-1,0)(2,0)(3,0)(-3,-60)}node[axisnode,anchor=north]{$(-3,-50)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:findformdeg5} + \end{subfigure} + \caption{} + \label{poly:fig:findformula} + \end{figure} + + + + + \begin{exercises} + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{problem}[Prerequisite classifacation skills] + Decide if each of the following functions are linear or quadratic. + \begin{multicols}{3} + \begin{subproblem} + $f(x)=2x+3$ + \begin{shortsolution} + $f$ is linear. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $g(x)=10-7x$ + \begin{shortsolution} + $g$ is linear + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $h(x)=-x^2+3x-9$ + \begin{shortsolution} + $h$ is quadratic. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $k(x)=-17$ + \begin{shortsolution} + $k$ is linear. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $l(x)=-82x^2-4$ + \begin{shortsolution} + $l$ is quadratic + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $m(x)=6^2x-8$ + \begin{shortsolution} + $m$ is linear. + \end{shortsolution} + \end{subproblem} + \end{multicols} + \end{problem} + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{problem}[Prerequisite slope identification] + State the slope of each of the following linear functions, and + hence decide if each function is increasing or decreasing. + \begin{multicols}{4} + \begin{subproblem} + $\alpha(x)=4x+1$ + \begin{shortsolution} + $m=4$; $\alpha$ is increasing. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $\beta(x)=-9x$ + \begin{shortsolution} + $m=-9$; $\beta$ is decreasing. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $\gamma(t)=18t+100$ + \begin{shortsolution} + $m=18$; $\gamma$ is increasing. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $\delta(y)=23-y$ + \begin{shortsolution} + $m=-1$; $\delta$ is decreasing. + \end{shortsolution} + \end{subproblem} + \end{multicols} + Now let's generalize our findings for the most general linear function $f$ + that has formula $f(x)=mx+b$. Complete the following sentences. + \begin{subproblem} + When $m>0$, the function $f$ is $\ldots$ + \begin{shortsolution} + When $m>0$, the function $f$ is $\ldots$ \emph{increasing}. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + When $m<0$, the function $f$ is $\ldots$ + \begin{shortsolution} + When $m<0$, the function $f$ is $\ldots$ \emph{decreasing}. + \end{shortsolution} + \end{subproblem} + \end{problem} + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{problem}[Polynomial or not?] + Identify whether each of the following functions is a polynomial or not. + If the function is a polynomial, state its degree. + \begin{multicols}{3} + \begin{subproblem} + $p(x)=2x+1$ + \begin{shortsolution} + $p$ is a polynomial (you might also describe $p$ as linear). The degree of $p$ is 1. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=7x^2+4x$ + \begin{shortsolution} + $p$ is a polynomial (you might also describe $p$ as quadratic). The degree of $p$ is 2. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=\sqrt{x}+2x+1$ + \begin{shortsolution} + $p$ is not a polynomial; we require the powers of $x$ to be integer values. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=2^x-45$ + \begin{shortsolution} + $p$ is not a polynomial; the $2^x$ term is exponential. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=6x^4-5x^3+9$ + \begin{shortsolution} + $p$ is a polynomial, and the degree of $p$ is $6$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=-5x^{17}+9x+2$ + \begin{shortsolution} + $p$ is a polynomial, and the degree of $p$ is 17. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=4x(x+7)^2(x-3)^3$ + \begin{shortsolution} + $p$ is a polynomial, and the degree of $p$ is $6$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=4x^{-5}-x^2+x$ + \begin{shortsolution} + $p$ is not a polynomial because $-5$ is not a positive integer. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=-x^6(x^2+1)(x^3-2)$ + \begin{shortsolution} + $p$ is a polynomial, and the degree of $p$ is $11$. + \end{shortsolution} + \end{subproblem} + \end{multicols} + \end{problem} + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{problem}[Polynomial graphs] + Three polynomial functions $p$, $m$, and $n$ are shown in \crefrange{poly:fig:functionp}{poly:fig:functionn}. + The functions have the following formulas + \begin{align*} + p(x) & = (x-1)(x+2)(x-3) \\ + m(x) & = -(x-1)(x+2)(x-3) \\ + n(x) & = (x-1)(x+2)(x-3)(x+1)(x+4) + \end{align*} + Note that for our present purposes we are not concerned with the vertical scale of the graphs. + \begin{subproblem} + Identify both on the graph {\em and} algebraically, the zeros of each polynomial. + \begin{shortsolution} + $y=p(x)$ is shown below. + + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-10,ymax=10, + width=\solutionfigurewidth, + ] + \addplot expression[domain=-2.5:3.5,samples=50]{(x-1)*(x+2)*(x-3)}; + \addplot[soldot] coordinates{(-2,0)(1,0)(3,0)}; + \end{axis} + \end{tikzpicture} + + $y=m(x)$ is shown below. + + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-10,ymax=10, + width=\solutionfigurewidth, + ] + \addplot expression[domain=-2.5:3.5,samples=50]{-1*(x-1)*(x+2)*(x-3)}; + \addplot[soldot] coordinates{(-2,0)(1,0)(3,0)}; + \end{axis} + \end{tikzpicture} + + $y=n(x)$ is shown below. + + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-90,ymax=70, + width=\solutionfigurewidth, + ] + \addplot expression[domain=-4.15:3.15,samples=50]{(x-1)*(x+2)*(x-3)*(x+1)*(x+4)}; + \addplot[soldot] coordinates{(-4,0)(-2,0)(-1,0)(1,0)(3,0)}; + \end{axis} + \end{tikzpicture} + + The zeros of $p$ are $-2$, $1$, and $3$; the zeros of $m$ are $-2$, $1$, and $3$; the zeros of $n$ are + $-4$, $-2$, $-1$, and $3$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Write down the degree, how many times the curve of each function `turns around', + and how many zeros it has + \begin{shortsolution} + \begin{itemize} + \item The degree of $p$ is 3, and the curve $y=p(x)$ turns around twice. + \item The degree of $q$ is also 3, and the curve $y=q(x)$ turns around twice. + \item The degree of $n$ is $5$, and the curve $y=n(x)$ turns around 4 times. + \end{itemize} + \end{shortsolution} + \end{subproblem} + \end{problem} + + \begin{figure}[!htb] + \begin{widepage} + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-10,ymax=10, + ytick={-5,5}, + width=\textwidth, + ] + \addplot expression[domain=-2.5:3.5,samples=50]{(x-1)*(x+2)*(x-3)}; + \addplot[soldot]coordinates{(-2,0)(1,0)(3,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=p(x)$} + \label{poly:fig:functionp} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-10,ymax=10, + ytick={-5,5}, + width=\textwidth, + ] + \addplot expression[domain=-2.5:3.5,samples=50]{-1*(x-1)*(x+2)*(x-3)}; + \addplot[soldot]coordinates{(-2,0)(1,0)(3,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=m(x)$} + \label{poly:fig:functionm} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-90,ymax=70, + width=\textwidth, + ] + \addplot expression[domain=-4.15:3.15,samples=100]{(x-1)*(x+2)*(x-3)*(x+1)*(x+4)}; + \addplot[soldot]coordinates{(-4,0)(-2,0)(-1,0)(1,0)(3,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=n(x)$} + \label{poly:fig:functionn} + \end{subfigure} + \caption{} + \end{widepage} + \end{figure} + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{problem}[Horizontal intercepts]\label{poly:prob:matchpolys}% + State the horizontal intercepts (as ordered pairs) of the following polynomials. + \begin{multicols}{2} + \begin{subproblem}\label{poly:prob:degree5} + $p(x)=(x-1)(x+2)(x-3)(x+1)(x+4)$ + \begin{shortsolution} + $(-4,0)$, $(-2,0)$, $(-1,0)$, $(1,0)$, $(3,0)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $q(x)=-(x-1)(x+2)(x-3)$ + \begin{shortsolution} + $(-2,0)$, $(1,0)$, $(3,0)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $r(x)=(x-1)(x+2)(x-3)$ + \begin{shortsolution} + $(-2,0)$, $(1,0)$, $(3,0)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem}\label{poly:prob:degree2} + $s(x)=(x-2)(x+2)$ + \begin{shortsolution} + $(-2,0)$, $(2,0)$ + \end{shortsolution} + \end{subproblem} + \end{multicols} + \end{problem} + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{problem}[Minimums, maximums, and concavity]\label{poly:prob:incdec} + Four polynomial functions are graphed in \cref{poly:fig:incdec}. The formulas + for these functions are (not respectively) + \begin{gather*} + p(x)=\frac{x^3}{6}-\frac{x^2}{4}-3x, \qquad q(x)=\frac{x^4}{20}+\frac{x^3}{15}-\frac{6}{5}x^2+1\\ + r(x)=-\frac{x^5}{50}-\frac{x^4}{40}+\frac{2x^3}{5}+6, \qquad s(x)=-\frac{x^6}{6000}-\frac{x^5}{2500}+\frac{67x^4}{4000}+\frac{17x^3}{750}-\frac{42x^2}{125} + \end{gather*} + \begin{figure}[!htb] + \begin{widepage} + \setlength{\figurewidth}{.23\textwidth} + \centering + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + width=\textwidth, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-8,-6,...,8}, + grid=major, + ] + \addplot expression[domain=-5.28:4.68,samples=50]{-x^5/50-x^4/40+2*x^3/5+6}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:incdec3} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + width=\textwidth, + xmin=-10,xmax=10,ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-8,-6,...,8}, + grid=major, + ] + \addplot expression[domain=-6.08:4.967,samples=50]{x^4/20+x^3/15-6/5*x^2+1}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:incdec2} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + width=\textwidth, + xmin=-6,xmax=8,ymin=-10,ymax=10, + xtick={-4,-2,...,6}, + ytick={-8,-4,4,8}, + minor ytick={-6,-2,...,6}, + grid=both, + ] + \addplot expression[domain=-4.818:6.081,samples=50]{x^3/6-x^2/4-3*x}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:incdec1} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + width=\textwidth, + xmin=-10,xmax=10,ymin=-10,ymax=10, + xtick={-8,-4,4,8}, + ytick={-8,-4,4,8}, + minor xtick={-6,-2,...,6}, + minor ytick={-6,-2,...,6}, + grid=both, + ] + \addplot expression[domain=-9.77:8.866,samples=50]{-x^6/6000-x^5/2500+67*x^4/4000+17/750*x^3-42/125*x^2}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:incdec4} + \end{subfigure} + \caption{Graphs for \cref{poly:prob:incdec}.} + \label{poly:fig:incdec} + \end{widepage} + \end{figure} + \begin{subproblem} + Match each of the formulas with one of the given graphs. + \begin{shortsolution} + \begin{itemize} + \item $p$ is graphed in \vref{poly:fig:incdec1}; + \item $q$ is graphed in \vref{poly:fig:incdec2}; + \item $r$ is graphed in \vref{poly:fig:incdec3}; + \item $s$ is graphed in \vref{poly:fig:incdec4}. + \end{itemize} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Approximate the zeros of each function using the appropriate graph. + \begin{shortsolution} + \begin{itemize} + \item $p$ has simple zeros at about $-3.8$, $0$, and $5$. + \item $q$ has simple zeros at about $-5.9$, $-1$, $1$, and $4$. + \item $r$ has simple zeros at about $-5$, $-2.9$, and $4.1$. + \item $s$ has simple zeros at about $-9$, $-6$, $4.2$, $8.1$, and a zero of multiplicity $2$ at $0$. + \end{itemize} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Approximate the local maximums and minimums of each of the functions. + \begin{shortsolution} + \begin{itemize} + \item $p$ has a local maximum of approximately $3.9$ at $-2$, and a local minimum of approximately $-6.5$ at $3$. + \item $q$ has a local minimum of approximately $-10$ at $-4$, and $-4$ at $3$; $q$ has a local maximum of approximately $1$ at $0$. + \item $r$ has a local minimum of approximately $-5.5$ at $-4$, and a local maximum of approximately $10$ at $3$. + \item $s$ has a local maximum of approximately $5$ at $-8$, $0$ at $0$, and $5$ at $7$; $s$ has local minimums + of approximately $-3$ at $-4$, and $-1$ at $3$. + \end{itemize} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Approximate the global maximums and minimums of each of the functions. + \begin{shortsolution} + \begin{itemize} + \item $p$ does not have a global maximum, nor a global minimum. + \item $q$ has a global minimum of approximately $-10$; it does not have a global maximum. + \item $r$ does not have a global maximum, nor a global minimum. + \item $s$ has a global maximum of approximately $5$; it does not have a global minimum. + \end{itemize} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Approximate the intervals on which each function is increasing and decreasing. + \begin{shortsolution} + \begin{itemize} + \item $p$ is increasing on $(-\infty,-2)\cup (3,\infty)$, and decreasing on $(-2,3)$. + \item $q$ is increasing on $(-4,0)\cup (3,\infty)$, and decreasing on $(-\infty,-4)\cup (0,3)$. + \item $r$ is increasing on $(-4,3)$, and decreasing on $(-\infty,-4)\cup (3,\infty)$. + \item $s$ is increasing on $(-\infty,-8)\cup (-4,0)\cup (3,5)$, and decreasing on $(-8,-4)\cup (0,3)\cup (5,\infty)$. + \end{itemize} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Approximate the intervals on which each function is concave up and concave down. + \begin{shortsolution} + \begin{itemize} + \item $p$ is concave up on $(1,\infty)$, and concave down on $(-\infty,1)$. + \item $q$ is concave up on $(-\infty,-1)\cup (1,\infty)$, and concave down on $(-1,1)$. + \item $r$ is concave up on $(-\infty,-3)\cup (0,2)$, and concave down on $(-3,0)\cup (2,\infty)$. + \item $s$ is concave up on $(-6,-2)\cup (2,5)$, and concave down on $(-\infty,-6)\cup (-2,2)\cup (5,\infty)$. + \end{itemize} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + The degree of $q$ is $5$. Assuming that all of the real zeros of $q$ are + shown in its graph, how many complex zeros does $q$ have? + \begin{shortsolution} + \Vref{poly:fig:incdec2} shows that $q$ has $3$ real zeros + since the curve of $q$ cuts the horizontal axis $3$ times. + Since $q$ has degree $5$, $q$ must have $2$ complex zeros. + \end{shortsolution} + \end{subproblem} + \end{problem} + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{problem}[Long-run behaviour of polynomials] + Describe the long-run behavior of each of polynomial functions in + \crefrange{poly:prob:degree5}{poly:prob:degree2}. + \begin{shortsolution} + $\dd\lim_{x\rightarrow-\infty}p(x)=-\infty$, + $\dd\lim_{x\rightarrow\infty}p(x)=\infty$, + $\dd\lim_{x\rightarrow-\infty}q(x)=\infty$, + $\dd\lim_{x\rightarrow\infty}q(x)=-\infty$, + $\dd\lim_{x\rightarrow-\infty}r(x)=-\infty$, + $\dd\lim_{x\rightarrow\infty}r(x)=\infty$, + $\dd\lim_{x\rightarrow-\infty}s(x)=\infty$, + $\dd\lim_{x\rightarrow\infty}s(x)=\infty$, + \end{shortsolution} + \end{problem} + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{problem}[True of false?] + Let $p$ be a polynomial function. + Label each of the following statements as true (T) or false (F); if they are false, + provide an example that supports your answer. + \begin{subproblem} + If $p$ has degree $3$, then $p$ has $3$ distinct zeros. + \begin{shortsolution} + False. Consider $p(x)=x^2(x+1)$ which has only 2 distinct zeros. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + If $p$ has degree $4$, then $\dd\lim_{x\rightarrow-\infty}p(x)=\infty$ and $\dd\lim_{x\rightarrow\infty}p(x)=\infty$. + \begin{shortsolution} + False. Consider $p(x)=-x^4$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + If $p$ has even degree, then it is possible that $p$ can have no real zeros. + \begin{shortsolution} + True. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + If $p$ has odd degree, then it is possible that $p$ can have no real zeros. + \begin{shortsolution} + False. All odd degree polynomials will cut the horizontal axis at least once. + \end{shortsolution} + \end{subproblem} + \end{problem} + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{problem}[Find a formula from a description] + In each of the following problems, give a possible formula for a polynomial + function that has the specified properties. + \begin{subproblem} + Degree 2 and has zeros at $4$ and $5$. + \begin{shortsolution} + Possible option: $p(x)=(x-4)(x-5)$. Note we could multiply $p$ by any real number, and still meet the requirements. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Degree 3 and has zeros at $4$,$5$ and $-3$. + \begin{shortsolution} + Possible option: $p(x)=(x-4)(x-5)(x+3)$. Note we could multiply $p$ by any real number, and still meet the requirements. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Degree 4 and has zeros at $0$, $4$, $5$, $-3$. + \begin{shortsolution} + Possible option: $p(x)=x(x-4)(x-5)(x+3)$. Note we could multiply $p$ by any real number, and still meet the requirements. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Degree 4, with zeros that make the graph cut at $2$, $-5$, and a zero that makes the graph touch at $-2$; + \begin{shortsolution} + Possible option: $p(x)=(x-2)(x+5)(x+2)^2$. Note we could multiply $p$ by any real number, and still meet the requirements. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Degree 3, with only one zero at $-1$. + \begin{shortsolution} + Possible option: $p(x)=(x+1)^3$. Note we could multiply $p$ by any real number, and still meet the requirements. + \end{shortsolution} + \end{subproblem} + \end{problem} + %=================================== + % Author: Hughes + % Date: June 2012 + %=================================== + \begin{problem}[\Cref{poly:step:last}] + \pccname{Saheed} is graphing a polynomial function, $p$. + He is following \crefrange{poly:step:first}{poly:step:last} and has so far + marked the zeros of $p$ on \cref{poly:fig:optionsp1}. Saheed tells you that + $p$ has degree $3$, but does \emph{not} say if the leading coefficient + of $p$ is positive or negative. + \begin{figure}[!htbp] + \begin{widepage} + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-15}, + width=\textwidth, + height=.5\textwidth, + ] + \addplot[soldot] coordinates{(-5,0)(2,0)(6,0)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:optionsp1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-15}, + width=\textwidth, + height=.5\textwidth, + ] + \addplot[soldot] coordinates{(-5,0)(6,0)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{poly:fig:optionsp2} + \end{subfigure}% + \caption{} + \end{widepage} + \end{figure} + \begin{subproblem} + Use the information in \cref{poly:fig:optionsp1} to help sketch $p$, assuming that the leading coefficient + is positive. + \begin{shortsolution} + Assuming that $a_3>0$: + + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-15}, + width=\solutionfigurewidth, + ] + \addplot expression[domain=-6.78179:8.35598,samples=50]{1/20*(x+5)*(x-2)*(x-6)}; + \addplot[soldot] coordinates{(-5,0)(2,0)(6,0)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Use the information in \cref{poly:fig:optionsp1} to help sketch $p$, assuming that the leading coefficient + is negative. + \begin{shortsolution} + Assuming that $a_3<0$: + + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-15}, + width=\solutionfigurewidth, + ] + \addplot expression[domain=-6.78179:8.35598,samples=50]{-1/20*(x+5)*(x-2)*(x-6)}; + \addplot[soldot] coordinates{(-5,0)(2,0)(6,0)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + Saheed now turns his attention to another polynomial function, $q$. He finds + the zeros of $q$ (there are only $2$) and marks them on \cref{poly:fig:optionsp2}. + Saheed knows that $q$ has degree $3$, but doesn't know if the leading + coefficient is positive or negative. + \begin{subproblem} + Use the information in \cref{poly:fig:optionsp2} to help sketch $q$, assuming that the leading + coefficient of $q$ is positive. Hint: only one of the zeros is simple. + \begin{shortsolution} + Assuming that $a_4>0$ there are $2$ different options: + + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-15}, + width=\solutionfigurewidth, + ] + \addplot expression[domain=-8.68983:7.31809,samples=50]{1/20*(x+5)^2*(x-6)}; + \addplot expression[domain=-6.31809:9.68893,samples=50]{1/20*(x+5)*(x-6)^2}; + \addplot[soldot] coordinates{(-5,0)(6,0)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Use the information in \cref{poly:fig:optionsp2} to help sketch $q$, assuming that the leading + coefficient of $q$ is negative. + \begin{shortsolution} + Assuming that $a_4<0$ there are $2$ different options: + + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-15}, + width=\solutionfigurewidth, + ] + \addplot expression[domain=-8.68983:7.31809,samples=50]{-1/20*(x+5)^2*(x-6)}; + \addplot expression[domain=-6.31809:9.68893,samples=50]{-1/20*(x+5)*(x-6)^2}; + \addplot[soldot] coordinates{(-5,0)(6,0)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + \end{problem} + %=================================== + % Author: Hughes + % Date: June 2012 + %=================================== + \begin{problem}[Zeros] + Find all zeros of each of the following polynomial functions, making + sure to detail their multiplicity. Note that + you may need to use factoring, or the quadratic formula, or both! Also note + that some zeros may be repeated, and some may be complex. + \begin{multicols}{3} + \begin{subproblem} + $p(x)=x^2+1$ + \begin{shortsolution} + $\pm i$ (simple). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $q(y)=(y^2-9)(y^2-7)$ + \begin{shortsolution} + $\pm 3$, $\pm \sqrt{7}$ (all are simple). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $r(z)=-4z^3(z^2+3)(z^2+64)$ + \begin{shortsolution} + $0$ (multiplicity $3$), $\pm\sqrt{3}$ (simple), $\pm\sqrt{8}$ (simple). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $a(x)=x^4-81$ + \begin{shortsolution} + $\pm 3$, $\pm 3i$ (all are simple). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $b(y)=y^3-8$ + \begin{shortsolution} + $2$, $-1\pm i\sqrt{3}$ (all are simple). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $c(m)=m^3-m^2$ + \begin{shortsolution} + $0$ (multiplicity $2$), $1$ (simple). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $h(n)=(n+1)(n^2+4)$ + \begin{shortsolution} + $-1$, $\pm 2i$ (all are simple). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $f(\alpha)=(\alpha^2-16)(\alpha^2-5\alpha+4)$ + \begin{shortsolution} + $-4$ (simple), $4$ (multiplicity $2$), $1$ (simple). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $g(\beta)=(\beta^2-25)(\beta^2-5\beta-4)$ + \begin{shortsolution} + $\pm 5$, $\dfrac{5\pm\sqrt{41}}{2}$ (all are simple). + \end{shortsolution} + \end{subproblem} + \end{multicols} + \end{problem} + %=================================== + % Author: Hughes + % Date: June 2012 + %=================================== + \begin{problem}[Given zeros, find a formula] + In each of the following problems you are given the zeros of a polynomial. + Write a possible formula for each polynomial| you may leave your + answer in factored form, but it may not contain complex numbers. Unless + otherwise stated, assume that the zeros are simple. + \begin{multicols}{3} + \begin{subproblem} + $1$, $2$ + \begin{shortsolution} + $p(x)=(x-1)(x-2)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $0$, $5$, $13$ + \begin{shortsolution} + $p(x)=x(x-5)(x-13)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $-7$, $2$ (multiplicity $3$), $5$ + \begin{shortsolution} + $p(x)=(x+7)(x-2)^3(x-5)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $0$, $\pm i$ + \begin{shortsolution} + $p(x)=x(x^2+1)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $\pm 2i$, $\pm 7$ + \begin{shortsolution} + $p(x)=(x^2+4)(x^2-49)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $-2\pm i\sqrt{6}$ + \end{subproblem} + \end{multicols} + \end{problem} + %=================================== + % Author: Hughes + % Date: June 2012 + %=================================== + \begin{problem}[Composition of polynomials] + Let $p$ and $q$ be polynomial functions that have formulas + \[ + p(x)=(x+1)(x+2)(x+5), \qquad q(x)=3-x^4 + \] + Evaluate each of the following. + \begin{multicols}{4} + \begin{subproblem} + $(p\circ q)(0)$ + \begin{shortsolution} + $160$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(q\circ p)(0)$ + \begin{shortsolution} + $-9997$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(p\circ q)(1)$ + \begin{shortsolution} + $84$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(p\circ p)(0)$ + \begin{shortsolution} + $1980$ + \end{shortsolution} + \end{subproblem} + \end{multicols} + \end{problem} + %=================================== + % Author: Hughes + % Date: June 2012 + %=================================== + \begin{problem}[Piecewise polynomial functions] + Let $P$ be the piecewise-defined function with formula + \[ + P(x)=\begin{cases} + (1-x)(2x+5)(x^2+1), & x\leq -3\\ + 4-x^2, & -3<x < 4\\ + x^3 & x\geq 4 + \end{cases} +\] +Evaluate each of the following +\begin{multicols}{5} + \begin{subproblem} + $P(-4)$ + \begin{shortsolution} + $-255$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $P(0)$ + \begin{shortsolution} + $4$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $P(4)$ + \begin{shortsolution} + $64$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $P(-3)$ + \begin{shortsolution} + $-40$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(P\circ P)(0)$ + \begin{shortsolution} + $64$ + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} + +%=================================== +% Author: Hughes +% Date: July 2012 +%=================================== +\begin{problem}[Function algebra] +Let $p$ and $q$ be the polynomial functions that have formulas +\[ + p(x)=x(x+1)(x-3)^2, \qquad q(x)=7-x^2 +\] +Evaluate each of the following (if possible). +\begin{multicols}{4} + \begin{subproblem} + $(p+q)(1)$ + \begin{shortsolution} + $14$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(p-q)(0)$ + \begin{shortsolution} + $7$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(p\cdot q)(\sqrt{7})$ + \begin{shortsolution} + $0$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $\left( \frac{q}{p} \right)(1)$ + \begin{shortsolution} + $\frac{3}{4}$ + \end{shortsolution} + \end{subproblem} +\end{multicols} +\begin{subproblem} + What is the domain of the function $\frac{q}{p}$? + \begin{shortsolution} + $(-\infty,-1)\cup (-1,0)\cup (0,3)\cup (3,\infty)$ + \end{shortsolution} +\end{subproblem} +\end{problem} + +%=================================== +% Author: Hughes +% Date: July 2012 +%=================================== +\begin{problem}[Transformations: given the transformation, find the formula] +Let $p$ be the polynomial function that has formula. +\[ + p(x)=4x(x^2-1)(x+3) +\] +In each of the following +problems apply the given transformation to the function $p$ and +write a formula for the transformed version of $p$. +\begin{multicols}{2} + \begin{subproblem} + Shift $p$ to the right by $5$ units. + \begin{shortsolution} + $p(x-5)=4(x-5)(x-2)(x^2-10x+24)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Shift $p$ to the left by $6$ units. + \begin{shortsolution} + $p(x+6)=4(x+6)(x+9)(x^2+12x+35)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Shift $p$ up by $12$ units. + \begin{shortsolution} + $p(x)+12=4x(x^2-1)(x+3)+12$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Shift $p$ down by $2$ units. + \begin{shortsolution} + $p(x)-2=4x(x^2-1)(x+3)-2$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Reflect $p$ over the horizontal axis. + \begin{shortsolution} + $-p(x)=-4x(x^2-1)(x+3)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Reflect $p$ over the vertical axis. + \begin{shortsolution} + $p(-x)=-4x(x^2-1)(3-x)$ + \end{shortsolution} + \end{subproblem} +\end{multicols} +\end{problem} + +%=================================== +% Author: Hughes +% Date: May 2011 +%=================================== +\begin{problem}[Find a formula from a table]\label{poly:prob:findformula} +\Crefrange{poly:tab:findformulap}{poly:tab:findformulas} show values of polynomial functions, $p$, $q$, +$r$, and $s$. + +\begin{table}[!htb] + \centering + \begin{widepage} + \caption{Tables for \cref{poly:prob:findformula}} + \label{poly:tab:findformula} + \begin{subtable}{.2\textwidth} + \centering + \caption{$y=p(x)$} + \label{poly:tab:findformulap} + \begin{tabular}{rr} + \beforeheading + \heading{$x$} & \heading{$y$} \\ + \afterheading + $-4$ & $-56$ \\\normalline + $-3$ & $-18$ \\\normalline + $-2$ & $0$ \\\normalline + $-1$ & $4$ \\\normalline + $0$ & $0$ \\\normalline + $1$ & $-6$ \\\normalline + $2$ & $-8$ \\\normalline + $3$ & $0$ \\\normalline + $4$ & $24$ \\\lastline + \end{tabular} + \end{subtable} + \hfill + \begin{subtable}{.2\textwidth} + \centering + \caption{$y=q(x)$} + \label{poly:tab:findformulaq} + \begin{tabular}{rr} + \beforeheading + \heading{$x$} & \heading{$y$} \\ \afterheading + $-4$ & $-16$ \\\normalline + $-3$ & $-3$ \\\normalline + $-2$ & $0$ \\\normalline + $-1$ & $-1$ \\\normalline + $0$ & $0$ \\\normalline + $1$ & $9$ \\\normalline + $2$ & $32$ \\\normalline + $3$ & $75$ \\\normalline + $4$ & $144$ \\\lastline + \end{tabular} + \end{subtable} + \hfill + \begin{subtable}{.2\textwidth} + \centering + \caption{$y=r(x)$} + \label{poly:tab:findformular} + \begin{tabular}{rr} + \beforeheading + \heading{$x$} & \heading{$y$} \\ \afterheading + $-4$ & $105$ \\\normalline + $-3$ & $0$ \\\normalline + $-2$ & $-15$ \\\normalline + $-1$ & $0$ \\\normalline + $0$ & $9$ \\\normalline + $1$ & $0$ \\\normalline + $2$ & $-15$ \\\normalline + $3$ & $0$ \\\normalline + $4$ & $105$ \\\lastline + \end{tabular} + \end{subtable} + \hfill + \begin{subtable}{.2\textwidth} + \centering + \caption{$y=s(x)$} + \label{poly:tab:findformulas} + \begin{tabular}{rr} + \beforeheading + \heading{$x$} & \heading{$y$} \\ \afterheading + $-4$ & $75$ \\\normalline + $-3$ & $0$ \\\normalline + $-2$ & $-9$ \\\normalline + $-1$ & $0$ \\\normalline + $0$ & $3$ \\\normalline + $1$ & $0$ \\\normalline + $2$ & $15$ \\\normalline + $3$ & $96$ \\\normalline + $4$ & $760$ \\\lastline + \end{tabular} + \end{subtable} + \end{widepage} +\end{table} + +\begin{subproblem} + Assuming that all of the zeros of $p$ are shown (in \cref{poly:tab:findformulap}), how many zeros does $p$ have? + \begin{shortsolution} + $p$ has 3 zeros. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + What is the degree of $p$? + \begin{shortsolution} + $p$ is degree 3. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Write a formula for $p(x)$. + \begin{shortsolution} + $p(x)=x(x+2)(x-3)$ + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Assuming that all of the zeros of $q$ are shown (in \cref{poly:tab:findformulaq}), how many zeros does $q$ have? + \begin{shortsolution} + $q$ has 2 zeros. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Describe the difference in behavior of $p$ and $q$ at $-2$. + \begin{shortsolution} + $p$ changes sign at $-2$, and $q$ does not change sign at $-2$. + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Given that $q$ is a degree-$3$ polynomial, write a formula for $q(x)$. + \begin{shortsolution} + $q(x)=x(x+2)^2$ + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Assuming that all of the zeros of $r$ are shown (in \cref{poly:tab:findformular}), find a formula for $r(x)$. + \begin{shortsolution} + $r(x)=(x+3)(x+1)(x-1)(x-3)$ + \end{shortsolution} +\end{subproblem} +\begin{subproblem} + Assuming that all of the zeros of $s$ are shown (in \cref{poly:tab:findformulas}), find a formula for $s(x)$. + \begin{shortsolution} + $s(x)=(x+3)(x+1)(x-1)^2$ + \end{shortsolution} +\end{subproblem} +\end{problem} +\end{exercises} + +\section{Rational functions} + \subsection*{Power functions with negative exponents} + The study of rational functions will rely upon a good knowledge + of power functions with negative exponents. \Cref{rat:ex:oddpow,rat:ex:evenpow} are + simple but fundamental to understanding the behavior of rational functions. + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{pccexample}[Power functions with odd negative exponents]\label{rat:ex:oddpow} + Graph each of the following functions on your calculator, state their domain in interval notation, and their + behavior as $x\rightarrow 0^-$ and $x\rightarrow 0^+$. + \[ + f(x)=\frac{1}{x},\qquad g(x)=\dfrac{1}{x^3},\qquad h(x)=\dfrac{1}{x^5} + \] + \begin{pccsolution} + The functions $f$, $g$, and $k$ are plotted in \cref{rat:fig:oddpow}. + The domain of each of the functions $f$, $g$, and $h$ is $(-\infty,0)\cup (0,\infty)$. Note that + the long-run behavior of each of the functions is the same, and in particular + \begin{align*} + f(x)\rightarrow 0 & \text{ as } x\rightarrow\infty \\ + \mathllap{\text{and }} f(x)\rightarrow 0 & \text{ as } x\rightarrow-\infty + \end{align*} + The same results hold for $g$ and $h$. Note also that each of the functions + has a \emph{vertical asymptote} at $0$. We see that + \begin{align*} + f(x)\rightarrow -\infty & \text{ as } x\rightarrow 0^- \\ + \mathllap{\text{and }} f(x)\rightarrow \infty & \text{ as } x\rightarrow 0^+ + \end{align*} + The same results hold for $g$ and $h$. + + The curve of a function that has a vertical asymptote is necessarily separated + into \emph{branches}| each of the functions $f$, $g$, and $h$ have $2$ branches. + \end{pccsolution} + \end{pccexample} + + \begin{figure}[!htb] + \begin{minipage}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-3,xmax=3, + ymin=-5,ymax=5, + xtick={-2,-1,...,2}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\textwidth, + legend pos=north west, + ] + \addplot expression[domain=-3:-0.2]{1/x}; + \addplot expression[domain=-3:-0.584]{1/x^3}; + \addplot expression[domain=-3:-0.724]{1/x^5}; + \addplot expression[domain=0.2:3]{1/x}; + \addplot expression[domain=0.584:3]{1/x^3}; + \addplot expression[domain=0.724:3]{1/x^5}; + \addplot[soldot]coordinates{(-1,-1)}node[axisnode,anchor=north east]{$(-1,-1)$}; + \addplot[soldot]coordinates{(1,1)}node[axisnode,anchor=south west]{$(1,1)$}; + \legend{$f$,$g$,$h$} + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:oddpow} + \end{minipage}% + \hfill + \begin{minipage}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-3,xmax=3, + ymin=-5,ymax=5, + xtick={-2,-1,...,2}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\textwidth, + legend pos=south east, + ] + \addplot expression[domain=-3:-0.447]{1/x^2}; + \addplot expression[domain=-3:-0.668]{1/x^4}; + \addplot expression[domain=-3:-0.764]{1/x^6}; + \addplot expression[domain=0.447:3]{1/x^2}; + \addplot expression[domain=0.668:3]{1/x^4}; + \addplot expression[domain=0.764:3]{1/x^6}; + \addplot[soldot]coordinates{(-1,1)}node[axisnode,anchor=south east]{$(-1,1)$}; + \addplot[soldot]coordinates{(1,1)}node[axisnode,anchor=south west]{$(1,1)$}; + \legend{$F$,$G$,$H$} + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:evenpow} + \end{minipage}% + \end{figure} + + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{pccexample}[Power functions with even negative exponents]\label{rat:ex:evenpow}% + Graph each of the following functions, state their domain, and their + behavior as $x\rightarrow 0^-$ and $x\rightarrow 0^+$. + \[ + f(x)=\frac{1}{x^2},\qquad g(x)=\frac{1}{x^4},\qquad h(x)=\frac{1}{x^6} + \] + \begin{pccsolution} + The functions $F$, $G$, and $H$ are plotted in \cref{rat:fig:evenpow}. + The domain of each of the functions $F$, $G$, and $H$ is $(-\infty,0)\cup (0,\infty)$. Note that + the long-run behavior of each of the functions is the same, and in particular + \begin{align*} + F(x)\rightarrow 0 & \text{ as } x\rightarrow\infty \\ + \mathllap{\text{and }} f(x)\rightarrow 0 & \text{ as } x\rightarrow-\infty + \end{align*} + As in \cref{rat:ex:oddpow}, $F$ has a horizontal asymptote that + has equation $y=0$. + The same results hold for $G$ and $H$. Note also that each of the functions + has a \emph{vertical asymptote} at $0$. We see that + \begin{align*} + F(x)\rightarrow \infty & \text{ as } x\rightarrow 0^- \\ + \mathllap{\text{and }} F(x)\rightarrow \infty & \text{ as } x\rightarrow 0^+ + \end{align*} + The same results hold for $G$ and $H$. Each of the functions $F$, $G$, and $H$ + have $2$ branches. + \end{pccsolution} + \end{pccexample} + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{doyouunderstand} + \begin{problem} + Repeat \cref{rat:ex:oddpow,rat:ex:evenpow} using (respectively) + \begin{subproblem} + $k(x)=-\dfrac{1}{x}$, $ m(x)=-\dfrac{1}{x^3}$, $ n(x)=-\dfrac{1}{x^5}$ + \begin{shortsolution} + The functions $k$, $m$, and $n$ have domain $(-\infty,0)\cup (0,\infty)$, and + are graphed below. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-3,xmax=3, + ymin=-5,ymax=5, + xtick={-2,-1,...,2}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\solutionfigurewidth, + legend pos=north east, + ] + \addplot expression[domain=-3:-0.2]{-1/x}; + \addplot expression[domain=-3:-0.584]{-1/x^3}; + \addplot expression[domain=-3:-0.724]{-1/x^5}; + \addplot expression[domain=0.2:3]{-1/x}; + \addplot expression[domain=0.584:3]{-1/x^3}; + \addplot expression[domain=0.724:3]{-1/x^5}; + \legend{$k$,$m$,$n$} + \end{axis} + \end{tikzpicture} + + Note that + \begin{align*} + k(x)\rightarrow 0 & \text{ as } x\rightarrow\infty \\ + \mathllap{\text{and }} k(x)\rightarrow 0 & \text{ as } x\rightarrow-\infty \\ + \intertext{and also} + k(x)\rightarrow \infty & \text{ as } x\rightarrow 0^- \\ + \mathllap{\text{and }} k(x)\rightarrow -\infty & \text{ as } x\rightarrow 0^+ + \end{align*} + The same are true for $m$ and $n$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $ K(x)=-\dfrac{1}{x^2}$, $ M(x)=-\dfrac{1}{x^4}$, $ N(x)=-\dfrac{1}{x^6}$ + \begin{shortsolution} + The functions $K$, $M$, and $N$ have domain $(-\infty,0)\cup (0,\infty)$, and + are graphed below. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-3,xmax=3, + ymin=-5,ymax=5, + xtick={-2,-1,...,2}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\solutionfigurewidth, + legend pos=north east, + ] + \addplot expression[domain=-3:-0.447]{-1/x^2}; + \addplot expression[domain=-3:-0.668]{-1/x^4}; + \addplot expression[domain=-3:-0.764]{-1/x^6}; + \addplot expression[domain=0.447:3]{-1/x^2}; + \addplot expression[domain=0.668:3]{-1/x^4}; + \addplot expression[domain=0.764:3]{-1/x^6}; + \legend{$K$,$M$,$N$} + \end{axis} + \end{tikzpicture} + + Note that + \begin{align*} + K(x)\rightarrow 0 & \text{ as } x\rightarrow\infty \\ + \mathllap{\text{and }} K(x)\rightarrow 0 & \text{ as } x\rightarrow-\infty \\ + \intertext{and also} + K(x)\rightarrow -\infty & \text{ as } x\rightarrow 0^- \\ + \mathllap{\text{and }} K(x)\rightarrow -\infty & \text{ as } x\rightarrow 0^+ + \end{align*} + The same are true for $M$ and $N$. + \end{shortsolution} + \end{subproblem} + \end{problem} + \end{doyouunderstand} + + \subsection*{Rational functions} + \begin{pccdefinition}[Rational functions]\label{rat:def:function} + Rational functions have the form + \[ + r(x) = \frac{p(x)}{q(x)} + \] + where both $p$ and $q$ are polynomials. + + Note that + \begin{itemize} + \item the domain or $r$ will be all real numbers, except those that + make the \emph{denominator}, $q(x)$, equal to $0$; + \item the zeros of $r$ are the zeros of $p$, i.e the real numbers + that make the \emph{numerator}, $p(x)$, equal to $0$. + \end{itemize} + + \Cref{rat:ex:oddpow,rat:ex:evenpow} are particularly important because $r$ + will behave like $\frac{1}{x}$, or $\frac{1}{x^2}$ around its vertical asymptotes, + depending on the power that the relevant term is raised to| we will demonstrate + this in what follows. + \end{pccdefinition} + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{pccexample}[Rational or not] + Identify whether each of the following functions is a rational or not. If + the function is rational, state the domain. + \begin{multicols}{3} + \begin{enumerate} + \item $r(x)=\dfrac{1}{x}$ + \item $f(x)=2^x+3$ + \item $g(x)=19$ + \item $h(x)=\dfrac{3+x}{4-x}$ + \item $k(x)=\dfrac{x^3+2x}{x-15}$ + \item $l(x)=9-4x$ + \item $m(x)=\dfrac{x+5}{(x-7)(x+9)}$ + \item $n(x)=x^2+6x+7$ + \item $q(x)=1-\dfrac{3}{x+1}$ + \end{enumerate} + \end{multicols} + \begin{pccsolution} + \begin{enumerate} + \item $r$ is rational; the domain of $r$ is $(-\infty,0)\cup(0,\infty)$. + \item $f$ is not rational. + \item $g$ is not rational; $g$ is constant. + \item $h$ is rational; the domain of $h$ is $(-\infty,4)\cup(4,\infty)$. + \item $k$ is rational; the domain of $k$ is $(-\infty,15)\cup(15,\infty)$. + \item $l$ is not rational; $l$ is linear. + \item $m$ is rational; the domain of $m$ is $(-\infty,-9)\cup(-9,7)\cup(7,\infty)$. + \item $n$ is not rational; $n$ is quadratic (or you might describe $n$ as a polynomial). + \item $q$ is rational; the domain of $q$ is $(-\infty,-1)\cup (-1,\infty)$. + \end{enumerate} + \end{pccsolution} + \end{pccexample} + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{pccexample}[Match formula to graph] + Each of the following functions is graphed in \cref{rat:fig:whichiswhich}. + Which is which? + \[ + r(x)=\frac{1}{x-3}, \qquad q(x)=\frac{x-2}{x+5}, \qquad k(x)=\frac{1}{(x+2)(x-3)} + \] + \begin{figure}[!htb] + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x-2)/(x+5);}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-6,ymax=6, + xtick={-8,-6,...,8}, + minor ytick={-4,-3,...,4}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:-6.37]{f}; + \addplot[pccplot] expression[domain=-3.97:10]{f}; + \addplot[soldot] coordinates{(2,0)}; + \addplot[asymptote,domain=-6:6]({-5},{x}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:which1} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=1/(x-3);}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-5,ymax=6, + xtick={-8,-6,...,8}, + ytick={-4,4}, + minor ytick={-3,...,5}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:2.8]{f}; + \addplot[pccplot] expression[domain=3.17:10]{f}; + \addplot[asymptote,domain=-6:6]({3},{x}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:which2} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=1/((x-3)*(x+2));}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-5,ymax=5, + xtick={-8,-6,...,8}, + ytick={-4,4}, + minor ytick={-3,...,3}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:-2.03969]{f}; + \addplot[pccplot] expression[domain=-1.95967:2.95967]{f}; + \addplot[pccplot] expression[domain=3.03969:10]{f}; + \addplot[asymptote,domain=-5:5]({-2},{x}); + \addplot[asymptote,domain=-5:5]({3},{x}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:which3} + \end{subfigure} + \caption{} + \label{rat:fig:whichiswhich} + \end{figure} + + \begin{pccsolution} + Let's start with the function $r$. Note that domain of $r$ is $(-\infty,3)\cup(0,3)$, so + we search for a function that has a vertical asymptote at $3$. There + are two possible choices: the functions graphed in \cref{rat:fig:which2,rat:fig:which3}, + but note that the function in \cref{rat:fig:which3} also has a vertical asymptote at $-2$ + which is not consistent with the formula for $r(x)$. Therefore, $y=r(x)$ + is graphed in \cref{rat:fig:which2}. + + The function $q$ has domain $(-\infty,-5)\cup(-5,\infty)$, so we search + for a function that has a vertical asymptote at $-5$. The only candidate + is the curve shown in \cref{rat:fig:which1}; note that the curve also goes through $(2,0)$, + which is consistent with the formula for $q(x)$, since $q(2)=0$, i.e $q$ + has a zero at $2$. + + The function $k$ has domain $(-\infty,-2)\cup(-2,3)\cup(3,\infty)$, and + has vertical asymptotes at $-2$ and $3$. This is consistent with + the graph in \cref{rat:fig:which3} (and is the only curve that + has $3$ branches). + + We note that each function behaves like $\frac{1}{x}$ around its vertical asymptotes, + because each linear factor in each denominator is raised to the power $1$; if (for example) + the definition of $r$ was instead + \[ + r(x)=\frac{1}{(x-3)^2} + \] + then we would see that $r$ behaves like $\frac{1}{x^2}$ around its vertical asymptote, and + the graph of $r$ would be very different. We will deal with these cases in the examples that follow. + \end{pccsolution} + \end{pccexample} + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{pccexample}[Repeated factors in the denominator] + Consider the functions $f$, $g$, and $h$ that have formulas + \[ + f(x)=\frac{x-2}{(x-3)(x+2)}, \qquad g(x)=\frac{x-2}{(x-3)^2(x+2)}, \qquad h(x)=\frac{x-2}{(x-3)(x+2)^2} + \] + which are graphed in \cref{rat:fig:repfactd}. Note that each function has $2$ + vertical asymptotes, and the domain of each function is + \[ + (-\infty,-2)\cup(-2,3)\cup(3,\infty) + \] + so we are not surprised to see that each curve has $3$ branches. We also note that + the numerator of each function is the same, which tells us that each function has + only $1$ zero at $2$. + + The functions $g$ and $h$ are different from those that we have considered previously, + because they have a repeated factor in the denominator. Notice in particular + the way that the functions behave around their asymptotes: + \begin{itemize} + \item $f$ behaves like $\frac{1}{x}$ around both of its asymptotes; + \item $g$ behaves like $\frac{1}{x}$ around $-2$, and like $\frac{1}{x^2}$ around $3$; + \item $h$ behaves like $\frac{1}{x^2}$ around $-2$, and like $\frac{1}{x}$ around $3$. + \end{itemize} + \end{pccexample} + \begin{figure}[!htb] + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x-2)/((x+2)*(x-3));}] + \begin{axis}[ + % framed, + xmin=-5,xmax=5, + ymin=-4,ymax=4, + xtick={-4,-2,...,4}, + ytick={-2,2}, + % grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-5:-2.201]{f}; + \addplot[pccplot] expression[domain=-1.802:2.951]{f}; + \addplot[pccplot] expression[domain=3.052:5]{f}; + \addplot[soldot] coordinates{(2,0)}; + % \addplot[asymptote,domain=-6:6]({-2},{x}); + % \addplot[asymptote,domain=-6:6]({3},{x}); + \end{axis} + \end{tikzpicture} + \caption{$y=\dfrac{x-2}{(x+2)(x-3)}$} + \label{rat:fig:repfactd1} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x-2)/((x+2)*(x-3)^2);}] + \begin{axis}[ + % framed, + xmin=-5,xmax=5, + ymin=-4,ymax=4, + xtick={-4,-2,...,4}, + ytick={-2,2}, + % grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-5:-2.039]{f}; + \addplot[pccplot] expression[domain=-1.959:2.796]{f}; + \addplot[pccplot] expression[domain=3.243:5]{f}; + \addplot[soldot] coordinates{(2,0)}; + % \addplot[asymptote,domain=-4:4]({-2},{x}); + % \addplot[asymptote,domain=-4:4]({3},{x}); + \end{axis} + \end{tikzpicture} + \caption{$y=\dfrac{x-2}{(x+2)(x-3)^2}$} + \label{rat:fig:repfactd2} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x-2)/((x+2)^2*(x-3));}] + \begin{axis}[ + % framed, + xmin=-5,xmax=5, + ymin=-4,ymax=4, + xtick={-4,-2,...,2}, + ytick={-2,2}, + % grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-5:-2.451]{f}; + \addplot[pccplot] expression[domain=-1.558:2.990]{f}; + \addplot[pccplot] expression[domain=3.010:6]{f}; + \addplot[soldot] coordinates{(2,0)}; + % \addplot[asymptote,domain=-4:4]({-2},{x}); + % \addplot[asymptote,domain=-4:4]({3},{x}); + \end{axis} + \end{tikzpicture} + \caption{$y=\dfrac{x-2}{(x+2)^2(x-3)}$} + \label{rat:fig:repfactd3} + \end{subfigure} + \caption{} + \label{rat:fig:repfactd} + \end{figure} + + \Cref{rat:def:function} says that the zeros of + the rational function $r$ that has formula $r(x)=\frac{p(x)}{q(x)}$ are + the zeros of $p$. Let's explore this a little more. + %=================================== + % Author: Hughes + % Date: May 2012 + %=================================== + \begin{pccexample}[Zeros] Find the zeros of each of the following functions + \[ + \alpha(x)=\frac{x+5}{3x-7}, \qquad \beta(x)=\frac{9-x}{x+1}, \qquad \gamma(x)=\frac{17x^2-10}{2x+1} + \] + \begin{pccsolution} + We find the zeros of each function in turn by setting the numerator equal to $0$. The zeros of + $\alpha$ are found by solving + \[ + x+5=0 + \] + The zero of $\alpha$ is $-5$. + + Similarly, we may solve $9-x=0$ to find the zero of $\beta$, which is clearly $9$. + + The zeros of $\gamma$ satisfy the equation + \[ + 17x^2-10=0 + \] + which we can solve using the square root property to obtain + \[ + x=\pm\frac{10}{17} + \] + The zeros of $\gamma$ are $\pm\frac{10}{17}$. + \end{pccsolution} + \end{pccexample} + + \subsection*{Long-run behavior} + Our focus so far has been on the behavior of rational functions around + their \emph{vertical} asymptotes. In fact, rational functions also + have interesting long-run behavior around their \emph{horizontal} or + \emph{oblique} asymptotes. A rational function will always have either + a horizontal or an oblique asymptote| the case is determined by the degree + of the numerator and the degree of the denominator. + \begin{pccdefinition}[Long-run behavior]\label{rat:def:longrun} + Let $r$ be the rational function that has formula + \[ + r(x) = \frac{a_n x^n + a_{n-1}x^{n-1}+\ldots + a_0}{b_m x^m + b_{m-1}x^{m-1}+\ldots+b_0} + \] + We can classify the long-run behavior of the rational function $r$ + according to the following criteria: + \begin{itemize} + \item if $n<m$ then $r$ has a horizontal asymptote with equation $y=0$; + \item if $n=m$ then $r$ has a horizontal asymptote with equation $y=\dfrac{a_n}{b_m}$; + \item if $n>m$ then $r$ will have an oblique asymptote as $x\rightarrow\pm\infty$ (more on this in \cref{rat:sec:oblique}) + \end{itemize} + \end{pccdefinition} + We will concentrate on functions that have horizontal asymptotes until + we reach \cref{rat:sec:oblique}. + + %=================================== + % Author: Hughes + % Date: May 2012 + %=================================== + \begin{pccexample}[Long-run behavior graphically]\label{rat:ex:horizasymp} + \pccname{Kebede} has graphed the following functions in his graphing calculator + \[ + r(x)=\frac{x+1}{x-3}, \qquad s(x)=\frac{2(x+1)}{x-3}, \qquad t(x)=\frac{3(x+1)}{x-3} + \] + and obtained the curves shown in \cref{rat:fig:horizasymp}. Kebede decides + to test his knowledgeable friend \pccname{Oscar}, and asks him + to match the formulas to the graphs. + + \begin{figure}[!htb] + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=2*(x+1)/(x-3);}] + \begin{axis}[ + framed, + xmin=-15,xmax=15, + ymin=-6,ymax=6, + xtick={-12,-8,...,12}, + minor ytick={-4,-3,...,4}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-15:2]{f}; + \addplot[pccplot] expression[domain=5:15]{f}; + \addplot[soldot] coordinates{(-1,0)}; + \addplot[asymptote,domain=-6:6]({3},{x}); + \addplot[asymptote,domain=-15:15]({x},{2}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:horizasymp1} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x+1)/(x-3);}] + \begin{axis}[ + framed, + xmin=-15,xmax=15, + ymin=-6,ymax=6, + xtick={-12,-8,...,12}, + minor ytick={-4,-3,...,4}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-15:2.42857,samples=50]{f}; + \addplot[pccplot] expression[domain=3.8:15,samples=50]{f}; + \addplot[soldot] coordinates{(-1,0)}; + \addplot[asymptote,domain=-6:6]({3},{x}); + \addplot[asymptote,domain=-15:15]({x},{1}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:horizasymp2} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=3*(x+1)/(x-3);}] + \begin{axis}[ + framed, + xmin=-15,xmax=15, + ymin=-6,ymax=6, + xtick={-12,-8,...,12}, + minor ytick={-4,-3,...,4}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-15:1.6666,samples=50]{f}; + \addplot[pccplot] expression[domain=7:15]{f}; + \addplot[soldot] coordinates{(-1,0)}; + \addplot[asymptote,domain=-6:6]({3},{x}); + \addplot[asymptote,domain=-15:15]({x},{3}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:horizasymp3} + \end{subfigure} + \caption{Horizontal asymptotes} + \label{rat:fig:horizasymp} + \end{figure} + + Oscar notices that each function has a vertical asymptote at $3$ and a zero at $-1$. + The main thing that catches Oscar's eye is that each function has a different + coefficient in the numerator, and that each curve has a different horizontal asymptote. + In particular, Oscar notes that + \begin{itemize} + \item the curve shown in \cref{rat:fig:horizasymp1} has a horizontal asymptote with equation $y=2$; + \item the curve shown in \cref{rat:fig:horizasymp2} has a horizontal asymptote with equation $y=1$; + \item the curve shown in \cref{rat:fig:horizasymp3} has a horizontal asymptote with equation $y=3$. + \end{itemize} + Oscar is able to tie it all together for Kebede by referencing \cref{rat:def:longrun}. He says + that since the degree of the numerator and the degree of the denominator is the same + for each of the functions $r$, $s$, and $t$, the horizontal asymptote will be determined + by evaluating the ratio of their leading coefficients. + + Oscar therefore says that $r$ should have a horizontal asymptote $y=\frac{1}{1}=1$, $s$ should + have a horizontal asymptote $y=\frac{2}{1}=2$, and $t$ should have a horizontal asymptote + $y=\frac{3}{1}=3$. Kebede is able to finish the problem from here, and says that $r$ is + shown in \cref{rat:fig:horizasymp2}, $s$ is shown in \cref{rat:fig:horizasymp1}, and + $t$ is shown in \cref{rat:fig:horizasymp3}. + \end{pccexample} + + %=================================== + % Author: Hughes + % Date: May 2012 + %=================================== + \begin{pccexample}[Long-run behavior numerically] + \pccname{Xiao} and \pccname{Dwayne} saw \cref{rat:ex:horizasymp} but are a little confused + about horizontal asymptotes. What does it mean to say that a function $r$ has a horizontal + asymptote? + + They decide to explore the concept by + constructing a table of values for the rational functions $R$ and $S$ that have formulas + \[ + R(x)=\frac{-5(x+1)}{x-3}, \qquad S(x)=\frac{7(x-5)}{2(x+1)} + \] + In \cref{rat:tab:plusinfty} they model the behavior of $R$ and $S$ as $x\rightarrow\infty$, + and in \cref{rat:tab:minusinfty} they model the behavior of $R$ and $S$ as $x\rightarrow-\infty$ + by substituting very large values of $|x|$ into each function. + \begin{table}[!htb] + \begin{minipage}{.5\textwidth} + \centering + \caption{$R$ and $S$ as $x\rightarrow\infty$} + \label{rat:tab:plusinfty} + \begin{tabular}{crr} + \beforeheading + $x$ & $R(x)$ & $S(x)$ \\ \afterheading + $1\times 10^2$ & $-5.20619$ & $3.29208$ \\\normalline + $1\times 10^3$ & $-5.02006$ & $3.47902$ \\\normalline + $1\times 10^4$ & $-5.00200$ & $3.49790$ \\\normalline + $1\times 10^5$ & $-5.00020$ & $3.49979$ \\\normalline + $1\times 10^6$ & $-5.00002$ & $3.49998$ \\\lastline + \end{tabular} + \end{minipage}% + \begin{minipage}{.5\textwidth} + \centering + \caption{$R$ and $S$ as $x\rightarrow-\infty$} + \label{rat:tab:minusinfty} + \begin{tabular}{crr} + \beforeheading + $x$ & $R(x)$ & $S(x)$ \\ \afterheading + $-1\times 10^2$ & $-4.80583$ & $3.71212$ \\\normalline + $-1\times 10^3$ & $-4.98006$ & $3.52102$ \\\normalline + $-1\times 10^4$ & $-4.99800$ & $3.50210$ \\\normalline + $-1\times 10^5$ & $-4.99980$ & $3.50021$ \\\normalline + $-1\times 10^6$ & $-4.99998$ & $3.50002$ \\\lastline + \end{tabular} + \end{minipage} + \end{table} + + Xiao and Dwayne study \cref{rat:tab:plusinfty,rat:tab:minusinfty} and decide that + the functions $R$ and $S$ never actually touch their horizontal asymptotes, but they + do get infinitely close. They also feel as if they have a better understanding of + what it means to study the behavior of a function as $x\rightarrow\pm\infty$. + \end{pccexample} + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{pccexample}[Repeated factors in the numerator] + Consider the functions $f$, $g$, and $h$ that have formulas + \[ + f(x)=\frac{(x-2)^2}{(x-3)(x+1)}, \qquad g(x)=\frac{x-2}{(x-3)(x+1)}, \qquad h(x)=\frac{(x-2)^3}{(x-3)(x+1)} + \] + which are graphed in \cref{rat:fig:repfactn}. We note that each function has vertical + asymptotes at $-1$ and $3$, and so the domain of each function is + \[ + (-\infty,-1)\cup(-1,3)\cup(3,\infty) + \] + We also notice that the numerators of each function are quite similar| indeed, each + function has a zero at $2$, but how does each function behave around their zero? + + Using \cref{rat:fig:repfactn} to guide us, we note that + \begin{itemize} + \item $f$ has a horizontal intercept $(2,0)$, but the curve of + $f$ does not cut the horizontal axis| it bounces off it; + \item $g$ also has a horizontal intercept $(2,0)$, and the curve + of $g$ \emph{does} cut the horizontal axis; + \item $h$ has a horizontal intercept $(2,0)$, and the curve of $h$ + also cuts the axis, but appears flattened as it does so. + \end{itemize} + + We can further enrich our study by discussing the long-run behavior of each function. + Using the tools of \cref{rat:def:longrun}, we can deduce that + \begin{itemize} + \item $f$ has a horizontal asymptote with equation $y=1$; + \item $g$ has a horizontal asymptote with equation $y=0$; + \item $h$ does \emph{not} have a horizontal asymptote| it has an oblique asymptote (we'll + study this more in \cref{rat:sec:oblique}). + \end{itemize} + \end{pccexample} + + \begin{figure}[!htb] + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x-2)^2/((x+1)*(x-3));}] + \begin{axis}[ + % framed, + xmin=-5,xmax=5, + ymin=-10,ymax=10, + xtick={-4,-2,...,4}, + ytick={-8,-4,...,8}, + % grid=both, + width=\figurewidth, + ] + \addplot[pccplot] expression[domain=-5:-1.248,samples=50]{f}; + \addplot[pccplot] expression[domain=-0.794:2.976,samples=50]{f}; + \addplot[pccplot] expression[domain=3.026:5,samples=50]{f}; + \addplot[soldot] coordinates{(2,0)}; + % \addplot[asymptote,domain=-6:6]({-1},{x}); + % \addplot[asymptote,domain=-6:6]({3},{x}); + \end{axis} + \end{tikzpicture} + \caption{$y=\dfrac{(x-2)^2}{(x+1)(x-3)}$} + \label{rat:fig:repfactn1} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x-2)/((x+1)*(x-3));}] + \begin{axis}[ + % framed, + xmin=-5,xmax=5, + ymin=-10,ymax=10, + xtick={-4,-2,...,4}, + ytick={-8,-4,...,8}, + % grid=both, + width=\figurewidth, + ] + \addplot[pccplot] expression[domain=-5:-1.075]{f}; + \addplot[pccplot] expression[domain=-0.925:2.975]{f}; + \addplot[pccplot] expression[domain=3.025:5]{f}; + \addplot[soldot] coordinates{(2,0)}; + % \addplot[asymptote,domain=-6:6]({-1},{x}); + % \addplot[asymptote,domain=-6:6]({3},{x}); + \end{axis} + \end{tikzpicture} + \caption{$y=\dfrac{x-2}{(x+1)(x-3)}$} + \label{rat:fig:repfactn2} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x-2)^3/((x+1)*(x-3));}] + \begin{axis}[ + % framed, + xmin=-5,xmax=5, + xtick={-8,-6,...,8}, + % grid=both, + ymin=-30,ymax=30, + width=\figurewidth, + ] + \addplot[pccplot] expression[domain=-5:-1.27]{f}; + \addplot[pccplot] expression[domain=-0.806:2.99185]{f}; + \addplot[pccplot] expression[domain=3.0085:5]{f}; + \addplot[soldot] coordinates{(2,0)}; + % \addplot[asymptote,domain=-30:30]({-1},{x}); + % \addplot[asymptote,domain=-30:30]({3},{x}); + \end{axis} + \end{tikzpicture} + \caption{$y=\dfrac{(x-2)^3}{(x+1)(x-3)}$} + \label{rat:fig:repfactn3} + \end{subfigure} + \caption{} + \label{rat:fig:repfactn} + \end{figure} + + \subsection*{Holes} + Rational functions have a vertical asymptote at $a$ if the denominator is $0$ at $a$. + What happens if the numerator is $0$ at the same place? In this case, we say that the rational + function has a \emph{hole} at $a$. + \begin{pccdefinition}[Holes] + The rational function + \[ + r(x)=\frac{p(x)}{q(x)} + \] + has a hole at $a$ if $p(a)=q(a)=0$. Note that holes are different from + a vertical asymptotes. We represent that $r$ has a hole at the point + $(a,r(a))$ on the curve $y=r(x)$ by + using a hollow circle, $\circ$. + \end{pccdefinition} + + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{pccexample} + \pccname{Mohammed} and \pccname{Sue} have graphed the function $r$ that has formula + \[ + r(x)=\frac{x^2+x-6}{(x-2)} + \] + in their calculators, and can not decide if the correct graph + is \cref{rat:fig:hole} or \cref{rat:fig:hole1}. + + Luckily for them, Oscar is nearby, and can help them settle the debate. + Oscar demonstrates that + \begin{align*} + r(x) & =\frac{(x+3)(x-2)}{(x-2)} \\ + & = x+3 + \end{align*} + but only when $x\ne 2$, because the function is undefined at $2$. Oscar + says that this necessarily means that the domain or $r$ is + \[ + (-\infty,2)\cup(2,\infty) + \] + and that $r$ must have a hole at $2$. + + Mohammed and Sue are very grateful for the clarification, and conclude that + the graph of $r$ is shown in \cref{rat:fig:hole1}. + \begin{figure}[!htb] + \begin{minipage}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-4,...,8}, + ytick={-8,-4,...,8}, + grid=both, + width=\textwidth, + ] + \addplot expression[domain=-10:7]{x+3}; + \addplot[soldot] coordinates{(-3,0)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:hole} + \end{minipage}% + \hfill + \begin{minipage}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-4,...,8}, + ytick={-8,-4,...,8}, + grid=both, + width=\textwidth, + ] + \addplot expression[domain=-10:7]{x+3}; + \addplot[holdot] coordinates{(2,5)}; + \addplot[soldot] coordinates{(-3,0)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:hole1} + \end{minipage}% + \end{figure} + \end{pccexample} + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{pccexample} + Consider the function $f$ that has formula + \[ + f(x)=\frac{x(x+3)}{x^2-4x} + \] + The domain of $f$ is $(-\infty,0)\cup(0,4)\cup(4,\infty)$ because both $0$ and $4$ + make the denominator equal to $0$. Notice that + \begin{align*} + f(x) & = \frac{x(x+3)}{x(x-4)} \\ + & = \frac{x+3}{x-4} + \end{align*} + provided that $x\ne 0$. Since $0$ makes the numerator + and the denominator 0 at the same time, we say that $f$ has a hole at $(0,-\nicefrac{3}{4})$. + Note that this necessarily means that $f$ does not have a vertical intercept. + + We also note $f$ has a vertical asymptote at $4$; the function is graphed in \cref{rat:fig:holeex}. + \begin{figure}[!htb] + \centering + \begin{tikzpicture}[/pgf/declare function={f=(x+3)/(x-4);}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-8,-6,...,8}, + grid=both, + ] + \addplot[pccplot] expression[domain=-10:3.36364,samples=50]{f}; + \addplot[pccplot] expression[domain=4.77:10]{f}; + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[holdot]coordinates{(0,-0.75)}; + \addplot[soldot] coordinates{(-3,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=\dfrac{x(x+3)}{x^2-4x}$} + \label{rat:fig:holeex} + \end{figure} + \end{pccexample} + + + + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{pccexample}[Minimums and maximums] + \pccname{Seamus} and \pccname{Trang} are discussing rational functions. Seamus says that + if a rational function has a vertical asymptote, then it can + not possibly have local minimums and maximums, nor can it have + global minimums and maximums. + + Trang says this statement is not always true. She plots the functions + $f$ and $g$ that have formulas + \[ + f(x)=-\frac{32(x-1)(x+1)}{(x-2)^2(x+2)^2}, \qquad g(x)=\frac{32(x-1)(x+1)}{(x-2)^2(x+2)^2} + \] + in \cref{rat:fig:minmax1,rat:fig:minmax2} and shows them to Seamus. On seeing the graphs, + Seamus quickly corrects himself, and says that $f$ has a local (and global) + maximum of $2$ at $0$, and that $g$ has a local (and global) minimum of $-2$ at $0$. + + \begin{figure}[!htb] + \begin{minipage}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=-32*(x-1)*(x+1)/(( x-2)^2*(x+2)^2);}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-8,-6,...,8}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:-3.01]{f}; + \addplot[pccplot] expression[domain=-1.45:1.45]{f}; + \addplot[pccplot] expression[domain=3.01:10]{f}; + \addplot[soldot] coordinates{(-1,0)(1,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=f(x)$} + \label{rat:fig:minmax1} + \end{minipage}% + \hfill + \begin{minipage}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=32*(x-1)*(x+1)/(( x-2)^2*(x+2)^2);}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-8,-6,...,8}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:-3.01]{f}; + \addplot[pccplot] expression[domain=-1.45:1.45]{f}; + \addplot[pccplot] expression[domain=3.01:10]{f}; + \addplot[soldot] coordinates{(-1,0)(1,0)}; + \end{axis} + \end{tikzpicture} + \caption{$y=g(x)$} + \label{rat:fig:minmax2} + \end{minipage}% + \end{figure} + + Seamus also notes that (in its domain) the function $f$ is always concave down, and + that (in its domain) the function $g$ is always concave up. Furthermore, Trang + observes that each function behaves like $\frac{1}{x^2}$ around each of its vertical + asymptotes, because each linear factor in the denominator is raised to the power $2$. + + \pccname{Oscar} stops by and reminds both students about the long-run behavior; according + to \cref{rat:def:longrun} since the degree of the denominator is greater than the + degree of the numerator (in both functions), each function has a horizontal asymptote + at $y=0$. + \end{pccexample} + + + \investigation*{} + %=================================== + % Author: Pettit/Hughes + % Date: March 2012 + %=================================== + \begin{problem}[The spaghetti incident] + The same Queen from \vref{exp:prob:queenschessboard} has recovered from + the rice experiments, and has called her loyal jester for another challenge. + + The jester has an $11-$inch piece of uncooked spaghetti that he puts on a table; + he uses a book to cover $\unit[1]{inch}$ of it so that + $\unit[10]{inches}$ hang over the edge. The jester then produces a box of $\unit{mg}$ + weights that can be hung from the spaghetti. + + The jester says it will take $\unit[y]{mg}$ to break the spaghetti when hung + $\unit[x]{inches}$ from the edge, according to the rule $y=\frac{100}{x}$. + \begin{margintable} + \centering + \captionof{table}{} + \label{rat:tab:spaghetti} + \begin{tabular}{cc} + \beforeheading + \heading{$x$} & \heading{$y$} \\ + \afterheading + $1$ & \\\normalline + $2$ & \\\normalline + $3$ & \\\normalline + $4$ & \\\normalline + $5$ & \\\normalline + $6$ & \\\normalline + $7$ & \\\normalline + $8$ & \\\normalline + $9$ & \\\normalline + $10$ & \\\lastline + \end{tabular} + \end{margintable} + \begin{subproblem}\label{rat:prob:spaggt1} + Help the Queen complete \cref{rat:tab:spaghetti}, and use $2$ digits after the decimal + where appropriate. + \begin{shortsolution} + \begin{tabular}[t]{ld{2}} + \beforeheading + \heading{$x$} & \heading{$y$} \\ + \afterheading + $1$ & 100 \\\normalline + $2$ & 50 \\\normalline + $3$ & 33.33 \\\normalline + $4$ & 25 \\\normalline + $5$ & 20 \\\normalline + $6$ & 16.67 \\\normalline + $7$ & 14.29 \\\normalline + $8$ & 12.50 \\\normalline + $9$ & 11.11 \\\normalline + $10$ & 10 \\\lastline + \end{tabular} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + What do you notice about the number of $\unit{mg}$ that it takes to break + the spaghetti as $x$ increases? + \begin{shortsolution} + It seems that the number of $\unit{mg}$ that it takes to break the spaghetti decreases + as $x$ increases. + \end{shortsolution} + \end{subproblem} + \begin{subproblem}\label{rat:prob:spaglt1} + The Queen wonders what happens when $x$ gets very small| help the Queen construct + a table of values for $x$ and $y$ when $x=0.0001, 0.001, 0.01, 0.1, 0.5, 1$. + \begin{shortsolution} + \begin{tabular}[t]{d{2}l} + \beforeheading + \heading{$x$} & \heading{$y$} \\ + \afterheading + 0.0001 & $1000000$ \\\normalline + 0.001 & $100000$ \\\normalline + 0.01 & $10000$ \\\normalline + 0.1 & $1000$ \\\normalline + 0.5 & $200$ \\\normalline + 1 & $100$ \\\lastline + \end{tabular} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + What do you notice about the number of $\unit{mg}$ that it takes to break the spaghetti + as $x\rightarrow 0$? Would it ever make sense to let $x=0$? + \begin{shortsolution} + The number of $\unit{mg}$ required to break the spaghetti increases as $x\rightarrow 0$. + We can not allow $x$ to be $0$, as we can not divide by $0$, and we can not + be $0$ inches from the edge of the table. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Plot your results from \cref{rat:prob:spaggt1,rat:prob:spaglt1} on the same graph, + and join the points using a smooth curve| set the maximum value of $y$ as $200$, and + note that this necessarily means that you will not be able to plot all of the points. + \begin{shortsolution} + The graph of $y=\frac{100}{x}$ is shown below. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-2,xmax=11, + ymin=-20,ymax=200, + xtick={2,4,...,10}, + ytick={20,40,...,180}, + grid=major, + width=\solutionfigurewidth, + ] + \addplot+[-] expression[domain=0.5:10]{100/x}; + \addplot[soldot] coordinates{(0.5,200)(1,100)(2,50)(3,33.33) + (4,25)(5,20)(16.67)(7,14.29)(8,12.50)(9,11.11)(10,10)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Using your graph, observe what happens to $y$ as $x$ increases. If we could somehow + construct a piece of uncooked spaghetti that was $\unit[101]{inches}$ long, how many + $\unit{mg}$ would it take to break the spaghetti? + \begin{shortsolution} + As $x$ increases, $y\rightarrow 0$. If we could construct a piece of spaghetti + $\unit[101]{inches}$ long, it would only take $\unit[1]{mg}$ to break it $\left(\frac{100}{100}=1\right)$. Of course, + the weight of spaghetti would probably cause it to break without the weight. + \end{shortsolution} + \end{subproblem} + The Queen looks forward to more food-related investigations from her jester. + \end{problem} + + + + %=================================== + % Author: Adams (Hughes) + % Date: March 2012 + %=================================== + \begin{problem}[Debt Amortization] + To amortize a debt means to pay it off in a given length of time using + equal periodic payments. The payments include interest on the unpaid + balance. The following formula gives the monthly payment, $M$, in dollars + that is necessary to amortize a debt of $P$ dollars in $n$ months + at a monthly interest rate of $i$ + \[ + M=\frac{P\cdot i}{1-(1+i)^{-n}} + \] + Use this formula in each of the following problems. + \begin{subproblem} + What monthly payments are necessary on a credit card debt of \$2000 at + $\unit[1.5]{\%}$ monthly if you want to pay off the debt in $2$ years? + In one year? How much money will you save by paying off the debt in the + shorter amount of time? + \begin{shortsolution} + Paying off the debt in $2$ years, we use + \begin{align*} + M & = \frac{2000\cdot 0.015}{1-(1+0.015)^{-24}} \\ + & \approx 99.85 + \end{align*} + The monthly payments are \$99.85. + + Paying off the debt in $1$ year, we use + \begin{align*} + M & = \frac{2000\cdot 0.015}{1-(1+0.015)^{-12}} \\ + & \approx 183.36 + \end{align*} + The monthly payments are \$183.36 + + In the $2$-year model we would pay a total of $\$99.85\cdot 12=\$2396.40$. In the + $1$-year model we would pay a total of $\$183.36\cdot 12=\$2200.32$. We would therefore + save $\$196.08$ if we went with the $1$-year model instead of the $2$-year model. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + To purchase a home, a family needs a loan of \$300,000 at $\unit[5.2]{\%}$ + annual interest. Compare a $20$ year loan to a $30$ year loan and make + a recommendation for the family. + (Note: when given an annual interest rate, it is a common business practice to divide by + $12$ to get a monthly rate.) + \begin{shortsolution} + For the $20$-year loan we use + \begin{align*} + M & = \frac{300000\cdot \frac{0.052}{12}}{1-\left( 1+\frac{0.052}{12} \right)^{-12\cdot 20}} \\ + & \approx 2013.16 + \end{align*} + The monthly payments are \$2013.16. + + For the $30$-year loan we use + \begin{align*} + M & = \frac{300000\cdot \frac{0.052}{12}}{1-\left( 1+\frac{0.052}{12} \right)^{-12\cdot 30}} \\ + & \approx 1647.33 + \end{align*} + The monthly payments are \$1647.33. + + The total amount paid during the $20$-year loan is $\$2013.16\cdot 12\cdot 20=\$483,158.40$. + The total amount paid during the $30$-year loan is $\$1647.33\cdot 12\cdot 30=\$593,038.80$. + + Recommendation: if you can afford the payments, choose the $20$-year loan. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + \pccname{Ellen} wants to make monthly payments of \$100 to pay off a debt of \$3000 + at \unit[12]{\%} annual interest. How long will it take her to pay off the + debt? + \begin{shortsolution} + We are given $M=100$, $P=3000$, $i=0.01$, and we need to find $n$ + in the equation + \[ + 100 = \frac{3000\cdot 0.01}{1-(1+0.01)^{-n}} + \] + Using logarithms, we find that $n\approx 36$. It will take + Ellen about $3$ years to pay off the debt. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + \pccname{Jake} is going to buy a new car. He puts \$2000 down and wants to finance the + remaining \$14,000. The dealer will offer him \unit[4]{\%} annual interest for + $5$ years, or a \$2000 + rebate which he can use to reduce the amount of the loan and \unit[8]{\%} + annual interest for 5 years. Which should he choose? + \begin{shortsolution} + \begin{description} + \item[Option 1:] $\unit[4]{\%}$ annual interest for $5$ years on \$14,000. + This means that the monthly payments will be calculated using + \begin{align*} + M & = \frac{14000\cdot \frac{0.04}{12}}{1-\left( 1+\frac{0.04}{12} \right)^{-12\cdot 5}} \\ + & \approx 257.83 + \end{align*} + The monthly payments will be $\$257.83$. The total amount paid will be + $\$257.83\cdot 5\cdot 12=\$15,469.80$, of which $\$1469.80$ is interest. + \item[Option 2:] $\unit[8]{\%}$ annual interest for $5$ years on \$12,000. + This means that the monthly payments will be calculated using + \begin{align*} + M & = \frac{12000\cdot \frac{0.08}{12}}{1-\left( 1+\frac{0.08}{12} \right)^{-12\cdot 5}} \\ + & \approx 243.32 + \end{align*} + The monthly payments will be $\$243.32$. The total amount paid + will be $\$243.32\cdot 5\cdot 12 =\$14,599.20$, of which $\$2599.2$ is + interest. + \end{description} + Jake should choose option 1 to minimize the amount of interest + he has to pay. + \end{shortsolution} + \end{subproblem} + \end{problem} + + \begin{exercises} + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{problem}[Rational or not] + Decide if each of the following functions are rational or not. If + they are rational, state their domain. + \begin{multicols}{3} + \begin{subproblem} + $r(x)=\dfrac{3}{x}$ + \begin{shortsolution} + $r$ is rational; the domain of $r$ is $(-\infty,0)\cup (0,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $s(y)=\dfrac{y}{6}$ + \begin{shortsolution} + $s$ is not rational ($s$ is linear). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $t(z)=\dfrac{4-x}{7-8z}$ + \begin{shortsolution} + $t$ is rational; the domain of $t$ is $\left( -\infty,\dfrac{7}{8} \right)\cup \left( \dfrac{7}{8},\infty \right)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $u(w)=\dfrac{w^2}{(w-3)(w+4)}$ + \begin{shortsolution} + $u$ is rational; the domain of $w$ is $(-\infty,-4)\cup(-4,3)\cup(3,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $v(x)=\dfrac{4}{(x-2)^2}$ + \begin{shortsolution} + $v$ is rational; the domain of $v$ is $(-\infty,2)\cup(2,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $w(x)=\dfrac{9-x}{x+17}$ + \begin{shortsolution} + $w$ is rational; the domain of $w$ is $(-\infty,-17)\cup(-17,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $a(x)=x^2+4$ + \begin{shortsolution} + $a$ is not rational ($a$ is quadratic, or a polynomial of degree $2$). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $b(y)=3^y$ + \begin{shortsolution} + $b$ is not rational ($b$ is exponential). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $c(z)=\dfrac{z^2}{z^3}$ + \begin{shortsolution} + $c$ is rational; the domain of $c$ is $(-\infty,0)\cup (0,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $d(x)=x^2(x+3)(5x-7)$ + \begin{shortsolution} + $d$ is not rational ($d$ is a polynomial). + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $e(\alpha)=\dfrac{\alpha^2}{\alpha^2-1}$ + \begin{shortsolution} + $e$ is rational; the domain of $e$ is $(-\infty,-1)\cup(-1,1)\cup(1,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $f(\beta)=\dfrac{3}{4}$ + \begin{shortsolution} + $f$ is not rational ($f$ is constant). + \end{shortsolution} + \end{subproblem} + \end{multicols} + \end{problem} + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{problem}[Function evaluation] + Let $r$ be the function that has formula + \[ + r(x)=\frac{(x-2)(x+3)}{(x+5)(x-7)} + \] + Evaluate each of the following (if possible); if the value is undefined, + then state so. + \begin{multicols}{4} + \begin{subproblem} + $r(0)$ + \begin{shortsolution} + $\begin{aligned}[t] + r(0) & =\frac{(0-2)(0+3)}{(0+5)(0-7)} \\ + & =\frac{-6}{-35} \\ + & =\frac{6}{35} + \end{aligned}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $r(1)$ + \begin{shortsolution} + $\begin{aligned}[t] + r(1) & =\frac{(1-2)(1+3)}{(1+5)(1-7)} \\ + & =\frac{-4}{-36} \\ + & =\frac{1}{9} + \end{aligned}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $r(2)$ + \begin{shortsolution} + $\begin{aligned}[t] + r(2) & =\frac{(2-2)(2+3)}{(2+5)(2-7)} \\ + & = \frac{0}{-50} \\ + & =0 + \end{aligned}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $r(4)$ + \begin{shortsolution} + $\begin{aligned}[t] + r(4) & =\frac{(4-2)(4+3)}{(4+5)(4-7)} \\ + & =\frac{14}{-27} \\ + & =-\frac{14}{27} + \end{aligned}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $r(7)$ + \begin{shortsolution} + $\begin{aligned}[t] + r(7) & =\frac{(7-2)(7+3)}{(7+5)(7-7)} \\ + & =\frac{50}{0} + \end{aligned}$ + + $r(7)$ is undefined. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $r(-3)$ + \begin{shortsolution} + $\begin{aligned}[t] + r(-3) & =\frac{(-3-2)(-3+3)}{(-3+5)(-3-7)} \\ + & =\frac{0}{-20} \\ + & =0 + \end{aligned}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $r(-5)$ + \begin{shortsolution} + $\begin{aligned}[t] + r(-5) & =\frac{(-5-2)(-5+3)}{(-5+5)(-5-7)} \\ + & =\frac{14}{0} + \end{aligned}$ + + $r(-5)$ is undefined. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $r\left( \frac{1}{2} \right)$ + \begin{shortsolution} + $\begin{aligned}[t] + r\left( \frac{1}{2} \right) & = \frac{\left( \frac{1}{2}-2 \right)\left( \frac{1}{2}+3 \right)}{\left( \frac{1}{2}+5 \right)\left( \frac{1}{2}-7 \right)} \\ + & =\frac{-\frac{3}{2}\cdot\frac{7}{2}}{\frac{11}{2}\left( -\frac{13}{2} \right)} \\ + & =\frac{-\frac{21}{4}}{-\frac{143}{4}} \\ + & =\frac{37}{143} + \end{aligned}$ + \end{shortsolution} + \end{subproblem} + \end{multicols} + \end{problem} + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{problem}[Holes or asymptotes?] + State the domain of each of the following rational functions. Identify + any holes or asymptotes. + \begin{multicols}{3} + \begin{subproblem} + $f(x)=\dfrac{12}{x-2}$ + \begin{shortsolution} + $f$ has a vertical asymptote at $2$; the domain of $f$ is $(-\infty,2)\cup (2,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $g(x)=\dfrac{x^2+x}{(x+1)(x-2)}$ + \begin{shortsolution} + $g$ has a vertical asymptote at $2$, and a hole at $-1$; the domain of $g$ is $(-\infty,-1)\cup(-1,2)\cup(2,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $h(x)=\dfrac{x^2+5x+4}{x^2+x-12}$ + \begin{shortsolution} + $h$ has a vertical asymptote at $3$, and a whole at $-4$; the domain of $h$ is $(-\infty,-4)\cup(-4,3)\cup(3,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $k(z)=\dfrac{z+2}{2z-3}$ + \begin{shortsolution} + $k$ has a vertical asymptote at $\dfrac{3}{2}$; the domain of $k$ is $\left( -\infty,\dfrac{3}{2} \right)\cup\left( \dfrac{3}{2},\infty \right)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $l(w)=\dfrac{w}{w^2+1}$ + \begin{shortsolution} + $l$ does not have any vertical asymptotes nor holes; the domain of $w$ is $(-\infty,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $m(t)=\dfrac{14}{13-t^2}$ + \begin{shortsolution} + $m$ has vertical asymptotes at $\pm\sqrt{13}$; the domain of $m$ is $(-\infty,\sqrt{13})\cup(-\sqrt{13},\sqrt{13})\cup(\sqrt{13},\infty)$. + \end{shortsolution} + \end{subproblem} + \end{multicols} + \end{problem} + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{problem}[Find a formula from a graph] + Consider the rational functions graphed in \cref{rat:fig:findformula}. Find + the vertical asymptotes for each function, together with any zeros, and + give a possible formula for each. + \begin{shortsolution} + \begin{itemize} + \item \Vref{rat:fig:formula1}: possible formula is $r(x)=\dfrac{1}{x+5}$ + \item \Vref{rat:fig:formula2}: possible formula is $r(x)=\dfrac{(x+3)}{(x-5)}$ + \item \Vref{rat:fig:formula3}: possible formula is $r(x)=\dfrac{1}{(x-4)(x+3)}$. + \end{itemize} + \end{shortsolution} + \end{problem} + + \begin{figure}[!htb] + \begin{widepage} + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=1/(x+4);}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-6,ymax=6, + xtick={-8,-6,...,8}, + minor ytick={-4,-3,...,4}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:-4.16667,samples=50]{f}; + \addplot[pccplot] expression[domain=-3.83333:10,samples=50]{f}; + \addplot[asymptote,domain=-6:6]({-4},{x}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:formula1} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=(x+3)/(x-5);}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-6,ymax=6, + xtick={-8,-6,...,8}, + minor ytick={-4,-3,...,4}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:3.85714]{f}; + \addplot[pccplot] expression[domain=6.6:10]{f}; + \addplot[soldot] coordinates{(-3,0)}; + \addplot[asymptote,domain=-6:6]({5},{x}); + \addplot[asymptote,domain=-10:10]({x},{1}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:formula2} + \end{subfigure} + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture}[/pgf/declare function={f=1/((x-4)*(x+3));}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-3,ymax=3, + xtick={-8,-6,...,8}, + minor ytick={-4,-3,...,4}, + grid=both, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:-3.0473]{f}; + \addplot[pccplot] expression[domain=-2.95205:3.95205]{f}; + \addplot[pccplot] expression[domain=4.0473:10]{f}; + \addplot[asymptote,domain=-3:3]({-3},{x}); + \addplot[asymptote,domain=-3:3]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{0}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:formula3} + \end{subfigure} + \caption{} + \label{rat:fig:findformula} + \end{widepage} + \end{figure} + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{problem}[Find a formula from a description] + In each of the following problems, give a formula of a rational + function that has the listed properties. + \begin{subproblem} + Vertical asymptote at $2$. + \begin{shortsolution} + Possible option: $r(x)=\dfrac{1}{x-2}$. Note that we could multiply the + numerator or denominator by any real number and still have the desired properties. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Vertical asymptote at $5$. + \begin{shortsolution} + Possible option: $r(x)=\dfrac{1}{x-5}$. Note that we could multiply the + numerator or denominator by any real number and still have the desired properties. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Vertical asymptote at $-2$, and zero at $6$. + \begin{shortsolution} + Possible option: $r(x)=\dfrac{x-6}{x+2}$. Note that we could multiply the + numerator or denominator by any real number and still have the desired properties. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Zeros at $2$ and $-5$ and vertical asymptotes at $1$ and $-7$. + \begin{shortsolution} + Possible option: $r(x)=\dfrac{(x-2)(x+5)}{(x-1)(x+7)}$. Note that we could multiply the + numerator or denominator by any real number and still have the desired properties. + \end{shortsolution} + \end{subproblem} + \end{problem} + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{problem}[Given formula, find horizontal asymptotes] + Each of the following functions has a horizontal asymptote. Write the equation + of the horizontal asymptote for each function. + \begin{multicols}{3} + \begin{subproblem} + $f(x) = \dfrac{1}{x}$ + \begin{shortsolution} + $y=0$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $g(x) = \dfrac{2x+3}{x}$ + \begin{shortsolution} + $y=2$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $h(x) = \dfrac{x^2+2x}{x^2+3}$ + \begin{shortsolution} + $y=1$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $k(x) = \dfrac{x^2+7}{x}$ + \begin{shortsolution} + $y=1$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $l(x)=\dfrac{3x-2}{5x+8}$ + \begin{shortsolution} + $y=\dfrac{3}{5}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $m(x)=\dfrac{3x-2}{5x^2+8}$ + \begin{shortsolution} + $y=0$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $n(x)=\dfrac{(6x+1)(x-7)}{(11x-8)(x-5)}$ + \begin{shortsolution} + $y=\dfrac{6}{11}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $p(x)=\dfrac{19x^3}{5-x^4}$ + \begin{shortsolution} + $y=0$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $q(x)=\dfrac{14x^2+x}{1-7x^2}$ + \begin{shortsolution} + $y=-2$ + \end{shortsolution} + \end{subproblem} + \end{multicols} + \end{problem} + + %=================================== + % Author: Hughes + % Date: May 2012 + %=================================== + \begin{problem}[Given horizontal asymptotes, find formula] + In each of the following problems, give a formula for a function that + has the given horizontal asymptote. Note that there may be more than one option. + \begin{multicols}{4} + \begin{subproblem} + $y=7$ + \begin{shortsolution} + Possible option: $f(x)=\dfrac{7(x-2)}{x+1}$. Note that there + are other options, provided that the degree of the numerator is the same as the degree + of the denominator, and that the ratio of the leading + coefficients is $7$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=-1$ + \begin{shortsolution} + Possible option: $f(x)=\dfrac{5-x^2}{x^2+10}$. Note that there + are other options, provided that the degree of the numerator is the same as the degree + of the denominator, and that the ratio of the leading + coefficients is $10$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=53$ + \begin{shortsolution} + Possible option: $f(x)=\dfrac{53x^3}{x^3+4x^2-7}$. Note that there + are other options, provided that the degree of the numerator is the same as the degree + of the denominator, and that the ratio of the leading + coefficients is $53$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=-17$ + \begin{shortsolution} + Possible option: $f(x)=\dfrac{34(x+2)}{7-2x}$. Note that there + are other options, provided that the degree of the numerator is the same as the degree + of the denominator, and that the ratio of the leading + coefficients is $-17$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=\dfrac{3}{2}$ + \begin{shortsolution} + Possible option: $f(x)=\dfrac{3x+4}{2(x+1)}$. Note that there + are other options, provided that the degree of the numerator is the same as the degree + of the denominator, and that the ratio of the leading + coefficients is $\dfrac{3}{2}$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=0$ + \begin{shortsolution} + Possible option: $f(x)=\dfrac{4}{x}$. Note that there + are other options, provided that the degree of the numerator is less than the degree + of the denominator. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=-1$ + \begin{shortsolution} + Possible option: $f(x)=\dfrac{10x}{5-10x}$. Note that there + are other options, provided that the degree of the numerator is the same as the degree + of the denominator, and that the ratio of the leading + coefficients is $-1$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=2$ + \begin{shortsolution} + Possible option: $f(x)=\dfrac{8x-3}{4x+1}$. Note that there + are other options, provided that the degree of the numerator is the same as the degree + of the denominator, and that the ratio of the leading + coefficients is $2$. + \end{shortsolution} + \end{subproblem} + \end{multicols} + \end{problem} + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{problem}[Find a formula from a description] + In each of the following problems, give a formula for a function that + has the prescribed properties. Note that there may be more than one option. + \begin{subproblem} + $f(x)\rightarrow 3$ as $x\rightarrow\pm\infty$. + \begin{shortsolution} + Possible option: $f(x)=\dfrac{3(x-2)}{x+7}$. Note that + the zero and asymptote of $f$ could be changed, and $f$ would still have the desired properties. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $r(x)\rightarrow -4$ as $x\rightarrow\pm\infty$. + \begin{shortsolution} + Possible option: $r(x)=\dfrac{-4(x-2)}{x+7}$. Note that + the zero and asymptote of $r$ could be changed, and $r$ would still have the desired properties. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $k(x)\rightarrow 2$ as $x\rightarrow\pm\infty$, and $k$ has vertical asymptotes at $-3$ and $5$. + \begin{shortsolution} + Possible option: $k(x)=\dfrac{2x^2}{(x+3)(x-5)}$. Note that the denominator + must have the given factors; the numerator could be any degree $2$ polynomial, provided the + leading coefficient is $2$. + \end{shortsolution} + \end{subproblem} + \end{problem} + + %=================================== + % Author: Hughes + % Date: Feb 2011 + %=================================== + \begin{problem} + Let $r$ be the rational function that has + \[ + r(x) = \frac{(x+2)(x-1)}{(x+3)(x-4)} + \] + Each of the following questions are in relation to this function. + \begin{subproblem} + What is the vertical intercept of this function? State your answer as an + ordered pair. \index{rational functions!vertical intercept} + \begin{shortsolution} + $\left(0,\frac{1}{6}\right)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem}\label{rat:prob:rational} + What values of $x$ make the denominator equal to $0$? + \begin{shortsolution} + $-3,4$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Use your answer to \cref{rat:prob:rational} to write the domain of the function in + both interval, and set builder notation. %\index{rational functions!domain}\index{domain!rational functions} + \begin{shortsolution} + Interval notation: $(-\infty,-3)\cup (-3,4)\cup (4,\infty)$. + Set builder: $\{x|x\ne -3, \mathrm{and}\, x\ne 4\}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + What are the vertical asymptotes of the function? State your answers in + the form $x=$ + \begin{shortsolution} + $x=-3$ and $x=4$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem}\label{rat:prob:zeroes} + What values of $x$ make the numerator equal to $0$? + \begin{shortsolution} + $-2,1$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Use your answer to \cref{rat:prob:zeroes} to write the horizontal intercepts of + $r$ as ordered pairs. + \begin{shortsolution} + $(-2,0)$ and $(1,0)$ + \end{shortsolution} + \end{subproblem} + \end{problem} + + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{problem}[Holes] + \pccname{Josh} and \pccname{Pedro} are discussing the function + \[ + r(x)=\frac{x^2-1}{(x+3)(x-1)} + \] + \begin{subproblem} + What is the domain of $r$? + \begin{shortsolution} + The domain of $r$ is $(-\infty,-3)\cup(-3,1)\cup(1,\infty)$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Josh notices that the numerator can be factored- can you see how? + \begin{shortsolution} + $(x^2-1)=(x-1)(x+1)$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Pedro asks, `Doesn't that just mean that + \[ + r(x)=\frac{x+1}{x+3} + \] + for all values of $x$?' Josh says, `Nearly\ldots but not for all values of $x$'. + What does Josh mean? + \begin{shortsolution} + $r(x)=\dfrac{x+1}{x+3}$ provided that $x\ne -1$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Where does $r$ have vertical asymptotes, and where does it have holes? + \begin{shortsolution} + The function $r$ has a vertical asymptote at $-3$, and a hole at $1$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Sketch a graph of $r$. + \begin{shortsolution} + A graph of $r$ is shown below. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-8,-6,...,8}, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot] expression[domain=-10:-3.25]{(x+1)/(x+3)}; + \addplot[pccplot] expression[domain=-2.75:10]{(x+1)/(x+3)}; + \addplot[asymptote,domain=-10:10]({-3},{x}); + \addplot[holdot]coordinates{(1,0.5)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + \end{problem} + + %=================================== + % Author: Hughes + % Date: July 2012 + %=================================== + \begin{problem}[Function algebra] + Let $r$ and $s$ be the rational functions that have formulas + \[ + r(x)=\frac{2-x}{x+3}, \qquad s(x)=\frac{x^2}{x-4} + \] + Evaluate each of the following (if possible). + \begin{multicols}{4} + \begin{subproblem} + $(r+s)(5)$ + \begin{shortsolution} + $\frac{197}{8}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(r-s)(3)$ + \begin{shortsolution} + $\frac{53}{6}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(r\cdot s)(4)$ + \begin{shortsolution} + Undefined. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $\left( \frac{r}{s} \right)(1)$ + \begin{shortsolution} + $-\frac{3}{4}$ + \end{shortsolution} + \end{subproblem} + \end{multicols} + \end{problem} + + + %=================================== + % Author: Hughes + % Date: July 2012 + %=================================== + \begin{problem}[Transformations: given the transformation, find the formula] + Let $r$ be the rational function that has formula. + \[ + r(x)=\frac{x+5}{2x-3} + \] + In each of the following problems apply the given transformation to the function $r$ and + write a formula for the transformed version of $r$. + \begin{multicols}{2} + \begin{subproblem} + Shift $r$ to the right by $3$ units. + \begin{shortsolution} + $r(x-3)=\frac{x+2}{2x-9}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Shift $r$ to the left by $4$ units. + \begin{shortsolution} + $r(x+4)=\frac{x+9}{2x+5}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Shift $r$ up by $\pi$ units. + \begin{shortsolution} + $r(x)+\pi=\frac{x+5}{2x-3}+\pi$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Shift $r$ down by $17$ units. + \begin{shortsolution} + $r(x)-17=\frac{x+5}{2x-3}-17$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Reflect $r$ over the horizontal axis. + \begin{shortsolution} + $-r(x)=-\frac{x+5}{2x-3}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Reflect $r$ over the vertical axis. + \begin{shortsolution} + $r(-x)=\frac{x-5}{2x+3}$ + \end{shortsolution} + \end{subproblem} + \end{multicols} + \end{problem} + + + %=================================== + % Author: Hughes + % Date: May 2011 + %=================================== + \begin{problem}[Find a formula from a table]\label{rat:prob:findformula} + \Crefrange{rat:tab:findformular}{rat:tab:findformulau} show values of rational functions $r$, $q$, $s$, + and $t$. Assume that any values marked with an X are undefined. + + \begin{table}[!htb] + \begin{widepage} + \centering + \caption{Tables for \cref{rat:prob:findformula}} + \label{rat:tab:findformula} + \begin{subtable}{.2\textwidth} + \centering + \caption{$y=r(x)$} + \label{rat:tab:findformular} + \begin{tabular}{rr} + \beforeheading + $x$ & $y$ \\ \afterheading + $-4$ & $\nicefrac{7}{2}$ \\\normalline + $-3$ & $-18$ \\\normalline + $-2$ & X \\\normalline + $-1$ & $-4$ \\\normalline + $0$ & $\nicefrac{-3}{2}$ \\\normalline + $1$ & $\nicefrac{-2}{3}$ \\\normalline + $2$ & $\nicefrac{-1}{4}$ \\\normalline + $3$ & $0$ \\\normalline + $4$ & $\nicefrac{1}{6}$ \\\lastline + \end{tabular} + \end{subtable} + \hfill + \begin{subtable}{.2\textwidth} + \centering + \caption{$y=s(x)$} + \label{rat:tab:findformulas} + \begin{tabular}{rr} + \beforeheading + $x$ & $y$ \\ \afterheading + $-4$ & $\nicefrac{-2}{21}$ \\\normalline + $-3$ & $\nicefrac{-1}{12}$ \\\normalline + $-2$ & $0$ \\\normalline + $-1$ & X \\\normalline + $0$ & $\nicefrac{-2}{3}$ \\\normalline + $1$ & $\nicefrac{-3}{4}$ \\\normalline + $2$ & $\nicefrac{-4}{3}$ \\\normalline + $3$ & X \\\normalline + $4$ & $\nicefrac{6}{5}$ \\\lastline + \end{tabular} + \end{subtable} + \hfill + \begin{subtable}{.2\textwidth} + \centering + \caption{$y=t(x)$} + \label{rat:tab:findformulat} + \begin{tabular}{rr} + \beforeheading + $x$ & $y$ \\ \afterheading + $-4$ & $\nicefrac{3}{5}$ \\\normalline + $-3$ & $0$ \\\normalline + $-2$ & X \\\normalline + $-1$ & $3$ \\\normalline + $0$ & $3$ \\\normalline + $1$ & X \\\normalline + $2$ & $0$ \\\normalline + $3$ & $\nicefrac{3}{5}$ \\\normalline + $4$ & $\nicefrac{7}{9}$ \\\lastline + \end{tabular} + \end{subtable} + \hfill + \begin{subtable}{.2\textwidth} + \centering + \caption{$y=u(x)$} + \label{rat:tab:findformulau} + \begin{tabular}{rr} + \beforeheading + $x$ & $y$ \\ \afterheading + $-4$ & $\nicefrac{16}{7}$ \\\normalline + $-3$ & X \\\normalline + $-2$ & $-\nicefrac{4}{5}$ \\\normalline + $-1$ & $-\nicefrac{1}{8}$ \\\normalline + $0$ & $0$ \\\normalline + $1$ & $-\nicefrac{1}{8}$ \\\normalline + $2$ & $-\nicefrac{4}{5}$ \\\normalline + $3$ & X \\\normalline + $4$ & $\nicefrac{16}{7}$ \\\lastline + \end{tabular} + \end{subtable} + \end{widepage} + \end{table} + \begin{subproblem} + Given that the formula for $r(x)$ has the form $r(x)=\dfrac{x-A}{x-B}$, use \cref{rat:tab:findformular} + to find values of $A$ and $B$. + \begin{shortsolution} + $A=3$ and $B=-2$, so $r(x)=\dfrac{x-3}{x+2}$. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Check your formula by computing $r(x)$ at the values specified in the table. + \begin{shortsolution} + $\begin{aligned}[t] + r(-4) & = \frac{-4-3}{-4+2} \\ + & = \frac{7}{2} \\ + \end{aligned}$ + + $r(-3)=\ldots$ etc + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + The function $s$ in \cref{rat:tab:findformulas} has two vertical asymptotes and one zero. + Can you find a formula for $s(x)$? + \begin{shortsolution} + $s(x)=\dfrac{x+2}{(x-3)(x+1)}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Check your formula by computing $s(x)$ at the values specified in the table. + \begin{shortsolution} + $\begin{aligned}[t] + s(-4) & =\frac{-4+2}{(-4-3)(-4+1)} \\ + & =-\frac{2}{21} + \end{aligned}$ + + $s(-3)=\ldots$ etc + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Given that the formula for $t(x)$ has the form $t(x)=\dfrac{(x-A)(x-B)}{(x-C)(x-D)}$, use \cref{rat:tab:findformulat} to find the + values of $A$, $B$, $C$, and $D$; hence write a formula for $t(x)$. + \begin{shortsolution} + $t(x)=\dfrac{(x+3)(x-2)}{(x+2)(x+1)}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Given that the formula for $u(x)$ has the form $u(x)=\dfrac{(x-A)^2}{(x-B)(x-C)}$, use \cref{rat:tab:findformulau} to find the + values of $A$, $B$, and $C$; hence write a formula for $u(x)$. + \begin{shortsolution} + $u(x)=\dfrac{x^2}{(x+3)(x-3)}$ + \end{shortsolution} + \end{subproblem} + \end{problem} + \end{exercises} + +\section{Graphing rational functions (horizontal asymptotes)} + \reformatstepslist{R} % the steps list should be R1, R2, \ldots + We studied rational functions in the previous section, but were + not asked to graph them; in this section we will demonstrate the + steps to be followed in order to sketch graphs of the functions. + + Remember from \vref{rat:def:function} that rational functions have + the form + \[ + r(x)=\frac{p(x)}{q(x)} + \] + In this section we will restrict attention to the case when + \[ + \text{degree of }p\leq \text{degree of }q + \] + Note that this necessarily means that each function that we consider + in this section \emph{will have a horizontal asymptote} (see \vref{rat:def:longrun}). + The cases in which the degree of $p$ is greater than the degree of $q$ + is covered in the next section. + + Before we begin, it is important to remember the following: + \begin{itemize} + \item Our sketches will give a good representation of the overall + shape of the graph, but until we have the tools of calculus (from MTH 251) + we can not find local minimums, local maximums, and inflection points algebraically. This + means that we will make our best guess as to where these points are. + \item We will not concern ourselves too much with the vertical scale (because of + our previous point)| we will, however, mark the vertical intercept (assuming there is one), + and any horizontal asymptotes. + \end{itemize} + \begin{pccspecialcomment}[Steps to follow when sketching rational functions]\label{rat:def:stepsforsketch} + \begin{steps} + \item \label{rat:step:first} Find all vertical asymptotes and holes, and mark them on the + graph using dashed vertical lines and open circles $\circ$ respectively. + \item Find any intercepts, and mark them using solid circles $\bullet$; + determine if the curve cuts the axis, or bounces off it at each zero. + \item Determine the behavior of the function around each asymptote| does + it behave like $\frac{1}{x}$ or $\frac{1}{x^2}$? + \item \label{rat:step:penultimate} Determine the long-run behavior of the function, and mark the horizontal + asymptote using a dashed horizontal line. + \item \label{rat:step:last} Deduce the overall shape of the curve, and sketch it. If there isn't + enough information from the previous steps, then construct a table of values + including sample points from each branch. + \end{steps} + Remember that until we have the tools of calculus, we won't be able to + find the exact coordinates of local minimums, local maximums, and points + of inflection. + \end{pccspecialcomment} + + The examples that follow show how \crefrange{rat:step:first}{rat:step:last} can be + applied to a variety of different rational functions. + + %=================================== + % Author: Hughes + % Date: May 2012 + %=================================== + \begin{pccexample}\label{rat:ex:1overxminus2p2} + Use \crefrange{rat:step:first}{rat:step:last} to sketch a graph of the function $r$ + that has formula + \[ + r(x)=\frac{1}{x-2} + \] + \begin{pccsolution} + \begin{steps} + \item $r$ has a vertical asymptote at $2$; $r$ does not have any holes. The curve of + $r$ will have $2$ branches. + \item $r$ does not have any zeros since the numerator is never equal to $0$. The + vertical intercept of $r$ is $\left( 0,-\frac{1}{2} \right)$. + \item $r$ behaves like $\frac{1}{x}$ around its vertical asymptote since $(x-2)$ + is raised to the power $1$. + \item Since the degree of the numerator is less than the degree of the denominator, + according to \vref{rat:def:longrun} the horizontal asymptote of $r$ has equation $y=0$. + \item We put the details we have obtained so far on \cref{rat:fig:1overxminus2p1}. Notice + that there is only one way to complete the graph, which we have done in \cref{rat:fig:1overxminus2p2}. + \end{steps} + \end{pccsolution} + \end{pccexample} + + \begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-5,ymax=5, + width=\textwidth, + ] + \addplot[asymptote,domain=-5:5]({2},{x}); + \addplot[asymptote,domain=-5:5]({x},{0}); + \addplot[soldot] coordinates{(0,-0.5)}node[axisnode,anchor=north east]{$\left( 0,-\frac{1}{2} \right)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:1overxminus2p1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=1/(x-2);}] + \begin{axis}[ + xmin=-5,xmax=5, + ymin=-5,ymax=5, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-5:1.8,samples=50]{f}; + \addplot[pccplot] expression[domain=2.2:5]{f}; + \addplot[asymptote,domain=-5:5]({2},{x}); + \addplot[asymptote,domain=-5:5]({x},{0}); + \addplot[soldot] coordinates{(0,-0.5)}node[axisnode,anchor=north east]{$\left( 0,-\frac{1}{2} \right)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:1overxminus2p2} + \end{subfigure}% + \caption{$y=\dfrac{1}{x-2}$} + \end{figure} + + The function $r$ in \cref{rat:ex:1overxminus2p2} has a horizontal asymptote which has equation $y=0$. + This asymptote lies on the horizontal axis, and you might (understandably) find it hard + to distinguish between the two lines (\cref{rat:fig:1overxminus2p2}). When faced + with such a situation, it is perfectly acceptable to draw the horizontal axis + as a dashed line| just make sure to label it correctly. We will demonstrate this + in the next example. + + %=================================== + % Author: Hughes + % Date: May 2012 + %=================================== + \begin{pccexample}\label{rat:ex:1overxp1} + Use \crefrange{rat:step:first}{rat:step:last} to sketch a graph of the function $v$ + that has formula + \[ + v(x)=\frac{10}{x} + \] + \begin{pccsolution} + \begin{steps} + \item $v$ has a vertical asymptote at $0$. $v$ does not have + any holes. The curve of $v$ will have $2$ branches. + \item $v$ does not have any zeros (since $10\ne 0$). Furthermore, $v$ + does not have a vertical intercept since $v(0)$ is undefined. + \item $v$ behaves like $\frac{1}{x}$ around its vertical asymptote. + \item $v$ has a horizontal asymptote with equation $y=0$. + \item We put the details we have obtained so far in \cref{rat:fig:1overxp1}. + We do not have enough information to sketch $v$ yet (because $v$ does + not have any intercepts), so let's pick a sample + point in either of the $2$ branches| it doesn't matter where our sample point + is, because we know what the overall shape will be. Let's compute $v(2)$ + \begin{align*} + v(2) & =\dfrac{10}{2} \\ + & = 5 + \end{align*} + We therefore mark the point $(2,5)$ on \cref{rat:fig:1overxp2}, and then complete the sketch using + the details we found in the previous steps. + \end{steps} + + \begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-5,5}, + ytick={-5,5}, + axis line style={color=white}, + width=\textwidth, + ] + \addplot[asymptote,<->,domain=-10:10]({0},{x}); + \addplot[asymptote,<->,domain=-10:10]({x},{0}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:1overxp1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=10/x;}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-5,5}, + ytick={-5,5}, + axis line style={color=white}, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:-1]{f}; + \addplot[pccplot] expression[domain=1:10]{f}; + \addplot[soldot] coordinates{(2,5)}node[axisnode,anchor=south west]{$(2,5)$}; + \addplot[asymptote,<->,domain=-10:10]({0},{x}); + \addplot[asymptote,<->,domain=-10:10]({x},{0}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:1overxp2} + \end{subfigure}% + \caption{$y=\dfrac{10}{x}$} + \end{figure} + \end{pccsolution} + \end{pccexample} + + %=================================== + % Author: Hughes + % Date: May 2012 + %=================================== + \begin{pccexample}\label{rat:ex:asympandholep1} + Use \crefrange{rat:step:first}{rat:step:last} to sketch a graph of the function $u$ + that has formula + \[ + u(x)=\frac{-4(x^2-9)}{x^2-8x+15} + \] + \begin{pccsolution} + \begin{steps} + \item We begin by factoring both the numerator and denominator of $u$ to help + us find any vertical asymptotes or holes + \begin{align*} + u(x) & =\frac{-4(x^2-9)}{x^2-8x+15} \\ + & =\frac{-4(x+3)(x-3)}{(x-5)(x-3)} \\ + & =\frac{-4(x+3)}{x-5} + \end{align*} + provided that $x\ne 3$. Therefore $u$ has a vertical asymptote at $5$ and + a hole at $3$. The curve of $u$ has $2$ branches. + \item $u$ has a simple zero at $-3$. The vertical intercept of $u$ is $\left( 0,\frac{12}{5} \right)$. + \item $u$ behaves like $\frac{1}{x}$ around its vertical asymptote at $4$. + \item Using \vref{rat:def:longrun} the equation of the horizontal asymptote of $u$ is $y=-4$. + \item We put the details we have obtained so far on \cref{rat:fig:1overxminus2p1}. Notice + that there is only one way to complete the graph, which we have done in \cref{rat:fig:1overxminus2p2}. + \end{steps} + + \begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-20,ymax=20, + xtick={-8,-6,...,8}, + ytick={-10,10}, + width=\textwidth, + ] + \addplot[asymptote,domain=-20:20]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{-4}); + \addplot[soldot] coordinates{(-3,0)(0,2.4)}node[axisnode,anchor=south east]{$\left( 0,\frac{12}{5} \right)$}; + \addplot[holdot] coordinates{(3,12)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:asympandholep1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=-4*(x+3)/(x-5);}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-20,ymax=20, + xtick={-8,-6,...,8}, + ytick={-10,10}, + width=\textwidth, + ] + \addplot[pccplot] expression[domain=-10:3.6666,samples=50]{f}; + \addplot[pccplot] expression[domain=7:10]{f}; + \addplot[asymptote,domain=-20:20]({5},{x}); + \addplot[asymptote,domain=-10:10]({x},{-4}); + \addplot[soldot] coordinates{(-3,0)(0,2.4)}node[axisnode,anchor=south east]{$\left( 0,\frac{12}{5} \right)$}; + \addplot[holdot] coordinates{(3,12)}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:asympandholep2} + \end{subfigure}% + \caption{$y=\dfrac{-4(x+3)}{x-5}$} + \end{figure} + \end{pccsolution} + \end{pccexample} + + \Cref{rat:ex:1overxminus2p2,rat:ex:1overxp1,rat:ex:asympandholep1} have focused on functions + that only have one vertical asymptote; the remaining examples in this section + concern functions that have more than one vertical asymptote. We will demonstrate + that \crefrange{rat:step:first}{rat:step:last} still apply. + + %=================================== + % Author: Hughes + % Date: May 2012 + %=================================== + \begin{pccexample}\label{rat:ex:sketchtwoasymp} + Use \crefrange{rat:step:first}{rat:step:last} to sketch a graph of the function $w$ + that has formula + \[ + w(x)=\frac{2(x+3)(x-5)}{(x+5)(x-4)} + \] + \begin{pccsolution} + \begin{steps} + \item $w$ has vertical asymptotes at $-5$ and $4$. $w$ does not have + any holes. The curve of $w$ will have $3$ branches. + \item $w$ has simple zeros at $-3$ and $5$. The vertical intercept of $w$ + is $\left( 0,\frac{3}{2} \right)$. + \item $w$ behaves like $\frac{1}{x}$ around both of its vertical + asymptotes. + \item The degree of the numerator of $w$ is $2$ and the degree of the + denominator of $w$ is also $2$. Using the ratio of the leading coefficients + of the numerator and denominator, we say that $w$ has a horizontal + asymptote with equation $y=\frac{2}{1}=2$. + \item We put the details we have obtained so far on \cref{rat:fig:sketchtwoasymptp1}. + + The function $w$ is a little more complicated than the functions that + we have considered in the previous examples because the curve has $3$ + branches. When graphing such functions, it is generally a good idea to start with the branch + for which you have the most information| in this case, that is the \emph{middle} branch + on the interval $(-5,4)$. + + Once we have drawn the middle branch, there is only one way to complete the graph + (because of our observations about the behavior of $w$ around its vertical asymptotes), + which we have done in \cref{rat:fig:sketchtwoasymptp2}. + \end{steps} + \end{pccsolution} + \end{pccexample} + + \begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-5,5}, + width=\textwidth, + ] + \addplot[asymptote,domain=-10:10]({-5},{x}); + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{2}); + \addplot[soldot] coordinates{(-3,0)(5,0)}; + \addplot[soldot] coordinates{(0,1.5)}node[axisnode,anchor=north west]{$\left( 0,\frac{3}{2} \right)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:sketchtwoasymptp1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=2*(x+3)*(x-5)/( (x+5)*(x-4));}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-5,5}, + width=\textwidth, + ] + \addplot[asymptote,domain=-10:10]({-5},{x}); + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{2}); + \addplot[soldot] coordinates{(-3,0)(5,0)}; + \addplot[soldot] coordinates{(0,1.5)}node[axisnode,anchor=north west]{$\left( 0,\frac{3}{2} \right)$}; + \addplot[pccplot] expression[domain=-10:-5.56708]{f}; + \addplot[pccplot] expression[domain=-4.63511:3.81708]{f}; + \addplot[pccplot] expression[domain=4.13511:10]{f}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:sketchtwoasymptp2} + \end{subfigure}% + \caption{$y=\dfrac{2(x+3)(x-5)}{(x+5)(x-4)}$} + \end{figure} + + The rational functions that we have considered so far have had simple + factors in the denominator; each function has behaved like $\frac{1}{x}$ + around each of its vertical asymptotes. \Cref{rat:ex:2asympnozeros,rat:ex:2squaredasymp} + consider functions that have a repeated factor in the denominator. + + %=================================== + % Author: Hughes + % Date: May 2012 + %=================================== + \begin{pccexample}\label{rat:ex:2asympnozeros} + Use \crefrange{rat:step:first}{rat:step:last} to sketch a graph of the function $f$ + that has formula + \[ + f(x)=\frac{100}{(x+5)(x-4)^2} + \] + \begin{pccsolution} + \begin{steps} + \item $f$ has vertical asymptotes at $-5$ and $4$. $f$ does not have + any holes. The curve of $f$ will have $3$ branches. + \item $f$ does not have any zeros (since $100\ne 0$). The vertical intercept of $f$ + is $\left( 0,\frac{5}{4} \right)$. + \item $f$ behaves like $\frac{1}{x}$ around $-5$ and behaves like $\frac{1}{x^2}$ + around $4$. + \item The degree of the numerator of $f$ is $0$ and the degree of the + denominator of $f$ is $2$. $f$ has a horizontal asymptote with + equation $y=0$. + \item We put the details we have obtained so far on \cref{rat:fig:2asympnozerosp1}. + + The function $f$ is similar to the function $w$ that we considered in \cref{rat:ex:sketchtwoasymp}| + it has two vertical asymptotes and $3$ branches, but in contrast to $w$ it does not have any zeros. + + We sketch $f$ in \cref{rat:fig:2asympnozerosp2}, using the middle branch as our guide + because we have the most information about the function on the interval $(-5,4)$. + + Once we have drawn the middle branch, there is only one way to complete the graph + because of our observations about the behavior of $f$ around its vertical asymptotes (it behaves like $\frac{1}{x}$), + which we have done in \cref{rat:fig:2asympnozerosp2}. + + Note that we are not yet able to find the local minimum of $f$ algebraically on the interval $(-5,4)$, + so we make a reasonable guess as to where it is| we can be confident that it is above the horizontal axis + since $f$ has no zeros. You may think that this is unsatisfactory, but once we have the tools of calculus, we will + be able to find local minimums more precisely. + \end{steps} + \end{pccsolution} + \end{pccexample} + + \begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-5,5}, + width=\textwidth, + ] + \addplot[asymptote,domain=-10:10]({-5},{x}); + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{0}); + \addplot[soldot] coordinates{(0,1.25)}node[axisnode,anchor=south east]{$\left( 0,\frac{5}{4} \right)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:2asympnozerosp1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=100/( (x+5)*(x-4)^2);}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-5,5}, + width=\textwidth, + ] + \addplot[asymptote,domain=-10:10]({-5},{x}); + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{0}); + \addplot[soldot] coordinates{(0,1.25)}node[axisnode,anchor=south east]{$\left( 0,\frac{5}{4} \right)$}; + \addplot[pccplot] expression[domain=-10:-5.12022]{f}; + \addplot[pccplot] expression[domain=-4.87298:2.87298,samples=50]{f}; + \addplot[pccplot] expression[domain=5:10]{f}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:2asympnozerosp2} + \end{subfigure}% + \caption{$y=\dfrac{100}{(x+5)(x-4)^2}$} + \end{figure} + + %=================================== + % Author: Hughes + % Date: May 2012 + %=================================== + \begin{pccexample}\label{rat:ex:2squaredasymp} + Use \crefrange{rat:step:first}{rat:step:last} to sketch a graph of the function $g$ + that has formula + \[ + g(x)=\frac{50(2-x)}{(x+3)^2(x-5)^2} + \] + \begin{pccsolution} + \begin{steps} + \item $g$ has vertical asymptotes at $-3$ and $5$. $g$ does + not have any holes. The curve of $g$ will have $3$ branches. + \item $g$ has a simple zero at $2$. The vertical intercept of $g$ is + $\left( 0,\frac{4}{9} \right)$. + \item $g$ behaves like $\frac{1}{x^2}$ around both of its + vertical asymptotes. + \item The degree of the numerator of $g$ is $1$ and the degree of the denominator + of $g$ is $4$. Using \vref{rat:def:longrun}, we calculate that + the horizontal asymptote of $g$ has equation $y=0$. + \item The details that we have found so far have been drawn in + \cref{rat:fig:2squaredasymp1}. The function $g$ is similar to the functions + we considered in \cref{rat:ex:sketchtwoasymp,rat:ex:2asympnozeros} because + it has $2$ vertical asymptotes and $3$ branches. + + We sketch $g$ using the middle branch as our guide because we have the most information + about $g$ on the interval $(-3,5)$. Note that there is no other way to draw this branch + without introducing other zeros which $g$ does not have. + + Once we have drawn the middle branch, there is only one way to complete the graph + because of our observations about the behavior of $g$ around its vertical asymptotes| it + behaves like $\frac{1}{x^2}$. + + \end{steps} + \end{pccsolution} + \end{pccexample} + + \begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-5,5}, + width=\textwidth, + ] + \addplot[asymptote,domain=-10:10]({-3},{x}); + \addplot[asymptote,domain=-10:10]({5},{x}); + \addplot[asymptote,domain=-10:10]({x},{0}); + \addplot[soldot] coordinates{(2,0)(0,4/9)}node[axisnode,anchor=south west]{$\left( 0,\frac{4}{9} \right)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:2squaredasymp1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=50*(2-x)/( (x+3)^2*(x-5)^2);}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + ytick={-5,5}, + width=\textwidth, + ] + \addplot[asymptote,domain=-10:10]({-3},{x}); + \addplot[asymptote,domain=-10:10]({5},{x}); + \addplot[asymptote,domain=-10:10]({x},{0}); + \addplot[soldot] coordinates{(2,0)(0,4/9)}node[axisnode,anchor=south west]{$\left( 0,\frac{4}{9} \right)$}; + \addplot[pccplot] expression[domain=-10:-3.61504]{f}; + \addplot[pccplot] expression[domain=-2.3657:4.52773]{f}; + \addplot[pccplot] expression[domain=5.49205:10]{f}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:2squaredasymp2} + \end{subfigure}% + \caption{$y=\dfrac{50(2-x)}{(x+3)^2(x-5)^2}$} + \end{figure} + + Each of the rational functions that we have considered so far has had either + a \emph{simple} zero, or no zeros at all. Remember from our work on polynomial + functions, and particularly \vref{poly:def:multzero}, that a \emph{repeated} zero + corresponds to the curve of the function behaving differently at the zero + when compared to how the curve behaves at a simple zero. \Cref{rat:ex:doublezero} details a + function that has a non-simple zero. + + %=================================== + % Author: Hughes + % Date: June 2012 + %=================================== + \begin{pccexample}\label{rat:ex:doublezero} + Use \crefrange{rat:step:first}{rat:step:last} to sketch a graph of the function $g$ + that has formula + \[ + h(x)=\frac{(x-3)^2}{(x+4)(x-6)} + \] + \begin{pccsolution} + \begin{steps} + \item $h$ has vertical asymptotes at $-4$ and $6$. $h$ does + not have any holes. The curve of $h$ will have $3$ branches. + \item $h$ has a zero at $3$ that has \emph{multiplicity $2$}. + The vertical intercept of $h$ is + $\left( 0,-\frac{3}{8} \right)$. + \item $h$ behaves like $\frac{1}{x}$ around both of its + vertical asymptotes. + \item The degree of the numerator of $h$ is $2$ and the degree of the denominator + of $h$ is $2$. Using \vref{rat:def:longrun}, we calculate that + the horizontal asymptote of $h$ has equation $y=1$. + \item The details that we have found so far have been drawn in + \cref{rat:fig:doublezerop1}. The function $h$ is different + from the functions that we have considered in previous examples because + of the multiplicity of the zero at $3$. + + We sketch $h$ using the middle branch as our guide because we have the most information + about $h$ on the interval $(-4,6)$. Note that there is no other way to draw this branch + without introducing other zeros which $h$ does not have| also note how + the curve bounces off the horizontal axis at $3$. + + Once we have drawn the middle branch, there is only one way to complete the graph + because of our observations about the behavior of $h$ around its vertical asymptotes| it + behaves like $\frac{1}{x}$. + + \end{steps} + \end{pccsolution} + \end{pccexample} + + \begin{figure}[!htbp] + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-5,ymax=5, + xtick={-8,-6,...,8}, + ytick={-3,3}, + width=\textwidth, + ] + \addplot[asymptote,domain=-10:10]({-4},{x}); + \addplot[asymptote,domain=-10:10]({6},{x}); + \addplot[asymptote,domain=-10:10]({x},{1}); + \addplot[soldot] coordinates{(3,0)(0,-3/8)}node[axisnode,anchor=north west]{$\left( 0,-\frac{3}{8} \right)$}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:doublezerop1} + \end{subfigure}% + \hfill + \begin{subfigure}{.45\textwidth} + \begin{tikzpicture}[/pgf/declare function={f=(x-3)^2/((x+4)*(x-6));}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-5,ymax=5, + xtick={-8,-6,...,8}, + ytick={-3,3}, + width=\textwidth, + ] + \addplot[asymptote,domain=-10:10]({-4},{x}); + \addplot[asymptote,domain=-10:10]({6},{x}); + \addplot[asymptote,domain=-10:10]({x},{1}); + \addplot[soldot] coordinates{(3,0)(0,-3/8)}node[axisnode,anchor=north west]{$\left( 0,-\frac{3}{8} \right)$}; + \addplot[pccplot] expression[domain=-10:-5.20088]{f}; + \addplot[pccplot] expression[domain=-3.16975:5.83642,samples=50]{f}; + \addplot[pccplot] expression[domain=6.20088:10]{f}; + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:doublezerop2} + \end{subfigure}% + \caption{$y=\dfrac{(x-3)^2}{(x+4)(x-6)}$} + \end{figure} + \begin{exercises} + %=================================== + % Author: Hughes + % Date: June 2012 + %=================================== + \begin{problem}[\Cref{rat:step:last}]\label{rat:prob:deduce} + \pccname{Katie} is working on graphing rational functions. She + has been concentrating on functions that have the form + \begin{equation}\label{rat:eq:deducecurve} + f(x)=\frac{a(x-b)}{x-c} + \end{equation} + Katie notes that functions with this type of formula have a zero + at $b$, and a vertical asymptote at $c$. Furthermore, these functions + behave like $\frac{1}{x}$ around their vertical asymptote, and the + curve of each function will have $2$ branches. + + Katie has been working with $3$ functions that have the form given + in \cref{rat:eq:deducecurve}, and has followed \crefrange{rat:step:first}{rat:step:penultimate}; + her results are shown in \cref{rat:fig:deducecurve}. There is just one + more thing to do to complete the graphs| follow \cref{rat:step:last}. + Help Katie finish each graph by deducing the curve of each function. + \begin{shortsolution} + \Vref{rat:fig:deducecurve1} + + \begin{tikzpicture}[/pgf/declare function={f=3*(x+4)/(x+5);}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\solutionfigurewidth, + ] + \addplot[soldot] coordinates{(-4,0)(0,12/5)}; + \addplot[asymptote,domain=-10:10]({-5},{x}); + \addplot[asymptote,domain=-10:10]({x},{3}); + \addplot[pccplot] expression[domain=-10:-5.42857]{f}; + \addplot[pccplot] expression[domain=-4.76923:10,samples=50]{f}; + \end{axis} + \end{tikzpicture} + + \Vref{rat:fig:deducecurve2} + + \begin{tikzpicture}[/pgf/declare function={f=-3*(x-2)/(x-4);}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\solutionfigurewidth, + ] + \addplot[soldot] coordinates{(2,0)(0,-3/2)}; + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{-3}); + \addplot[pccplot] expression[domain=-10:3.53846,samples=50]{f}; + \addplot[pccplot] expression[domain=4.85714:10]{f}; + \end{axis} + \end{tikzpicture} + + \Vref{rat:fig:deducecurve4} + + \begin{tikzpicture}[/pgf/declare function={f=2*(x-6)/(x-4);}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\solutionfigurewidth, + ] + \addplot[soldot] coordinates{(6,0)(0,3)}; + \addplot[asymptote,domain=-10:10]({x},{2}); + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[pccplot] expression[domain=-10:3.5,samples=50]{f}; + \addplot[pccplot] expression[domain=4.3333:10]{f}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{problem} + + \begin{figure}[!htb] + \begin{widepage} + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-4,0)(0,12/5)}; + \addplot[asymptote,domain=-10:10]({-5},{x}); + \addplot[asymptote,domain=-10:10]({x},{3}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:deducecurve1} + \end{subfigure}% + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(2,0)(0,-3/2)}; + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{-3}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:deducecurve2} + \end{subfigure}% + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(6,0)(0,3)}; + \addplot[asymptote,domain=-10:10]({x},{2}); + \addplot[asymptote,domain=-10:10]({4},{x}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:deducecurve4} + \end{subfigure} + \caption{Graphs for \cref{rat:prob:deduce}} + \label{rat:fig:deducecurve} + \end{widepage} + \end{figure} + + %=================================== + % Author: Hughes + % Date: June 2012 + %=================================== + \begin{problem}[\Cref{rat:step:last} for more complicated rational functions]\label{rat:prob:deducehard} + \pccname{David} is also working on graphing rational functions, and + has been concentrating on functions that have the form + \[ + r(x)=\frac{a(x-b)(x-c)}{(x-d)(x-e)} + \] + David notices that functions with this type of formula have simple zeros + at $b$ and $c$, and vertical asymptotes at $d$ and $e$. Furthermore, + these functions behave like $\frac{1}{x}$ around both vertical asymptotes, + and the curve of the function will have $3$ branches. + + David has followed \crefrange{rat:step:first}{rat:step:penultimate} for + $3$ separate functions, and drawn the results in \cref{rat:fig:deducehard}. + Help David finish each graph by deducing the curve of each function. + \begin{shortsolution} + \Vref{rat:fig:deducehard1} + + \begin{tikzpicture}[/pgf/declare function={f=(x-6)*(x+3)/( (x-4)*(x+1));}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\solutionfigurewidth, + ] + \addplot[soldot] coordinates{(-3,0)(6,0)(0,9/2)}; + \addplot[asymptote,domain=-10:10]({-1},{x}); + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{2}); + \addplot[pccplot] expression[domain=-10:-1.24276]{f}; + \addplot[pccplot] expression[domain=-0.6666:3.66667]{f}; + \addplot[pccplot] expression[domain=4.24276:10]{f}; + \end{axis} + \end{tikzpicture} + + \Vref{rat:fig:deducehard2} + + \begin{tikzpicture}[/pgf/declare function={f=3*(x-2)*(x+3)/( (x-6)*(x+5));}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\solutionfigurewidth, + ] + \addplot[soldot] coordinates{(-3,0)(2,0)(0,3/5)}; + \addplot[asymptote,domain=-10:10]({-5},{x}); + \addplot[asymptote,domain=-10:10]({6},{x}); + \addplot[asymptote,domain=-10:10]({x},{3}); + \addplot[pccplot] expression[domain=-10:-5.4861]{f}; + \addplot[pccplot] expression[domain=-4.68395:5.22241]{f}; + \addplot[pccplot] expression[domain=7.34324:10]{f}; + \end{axis} + \end{tikzpicture} + + \Vref{rat:fig:deducehard3} + + \begin{tikzpicture}[/pgf/declare function={f=2*(x-7)*(x+3)/( (x+6)*(x-5));}] + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\solutionfigurewidth, + ] + \addplot[soldot] coordinates{(-3,0)(7,0)(0,1.4)}; + \addplot[asymptote,domain=-10:10]({-6},{x}); + \addplot[asymptote,domain=-10:10]({5},{x}); + \addplot[asymptote,domain=-10:10]({x},{2}); + \addplot[pccplot] expression[domain=-10:-6.91427]{f}; + \addplot[pccplot] expression[domain=-5.42252:4.66427]{f}; + \addplot[pccplot] expression[domain=5.25586:10]{f}; + \end{axis} + \end{tikzpicture} + + \end{shortsolution} + \end{problem} + + \begin{figure}[!htb] + \begin{widepage} + \setlength{\figurewidth}{0.3\textwidth} + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-3,0)(6,0)(0,9/2)}; + \addplot[asymptote,domain=-10:10]({-1},{x}); + \addplot[asymptote,domain=-10:10]({4},{x}); + \addplot[asymptote,domain=-10:10]({x},{2}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:deducehard1} + \end{subfigure}% + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-3,0)(2,0)(0,3/5)}; + \addplot[asymptote,domain=-10:10]({-5},{x}); + \addplot[asymptote,domain=-10:10]({6},{x}); + \addplot[asymptote,domain=-10:10]({x},{3}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:deducehard2} + \end{subfigure}% + \hfill + \begin{subfigure}{\figurewidth} + \begin{tikzpicture} + \begin{axis}[ + xmin=-10,xmax=10, + ymin=-10,ymax=10, + xtick={-8,-6,...,8}, + width=\textwidth, + ] + \addplot[soldot] coordinates{(-3,0)(7,0)(0,1.4)}; + \addplot[asymptote,domain=-10:10]({-6},{x}); + \addplot[asymptote,domain=-10:10]({5},{x}); + \addplot[asymptote,domain=-10:10]({x},{2}); + \end{axis} + \end{tikzpicture} + \caption{} + \label{rat:fig:deducehard3} + \end{subfigure}% + \hfill + \caption{Graphs for \cref{rat:prob:deducehard}} + \label{rat:fig:deducehard} + \end{widepage} + \end{figure} + %=================================== + % Author: Adams (Hughes) + % Date: March 2012 + %=================================== + \begin{problem}[\Crefrange{rat:step:first}{rat:step:last}] + Use \crefrange{rat:step:first}{rat:step:last} to sketch a graph of + each of the following functions + \fixthis{need 2 more subproblems here} + \begin{multicols}{4} + \begin{subproblem} + $y=\dfrac{4}{x+2}$ + \begin{shortsolution} + Vertical intercept: $(0,2)$; vertical asymptote: $x=-2$, horizontal asymptote: $y=0$. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-5,xmax=5, + ymin=-5,ymax=5, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot] expression[domain=-5:-2.8]{4/(x+2)}; + \addplot[pccplot] expression[domain=-1.2:5]{4/(x+2)}; + \addplot[soldot]coordinates{(0,2)}; + \addplot[asymptote,domain=-5:5]({-2},{x}); + \addplot[asymptote,domain=-5:5]({x},{0}); + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=\dfrac{2x-1}{x^2-9}$ + \begin{shortsolution} + Vertical intercept:$\left( 0,\frac{1}{9} \right)$; + horizontal intercept: $\left( \frac{1}{2},0 \right)$; + vertical asymptotes: $x=-3$, $x=3$, horizontal asymptote: $y=0$. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-5,xmax=5, + ymin=-5,ymax=5, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot] expression[domain=-5:-3.23974]{(2*x-1)/(x^2-9)}; + \addplot[pccplot,samples=50] expression[domain=-2.77321:2.83974]{(2*x-1)/(x^2-9)}; + \addplot[pccplot] expression[domain=3.17321:5]{(2*x-1)/(x^2-9)}; + \addplot[soldot]coordinates{(0,1/9)(1/2,0)}; + \addplot[asymptote,domain=-5:5]({-3},{x}); + \addplot[asymptote,domain=-5:5]({3},{x}); + \addplot[asymptote,domain=-5:5]({x},{0}); + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=\dfrac{x+3}{x-5}$ + \begin{shortsolution} + Vertical intercept $\left( 0,-\frac{3}{5} \right)$; horizontal + intercept: $(-3,0)$; vertical asymptote: $x=5$; horizontal asymptote: $y=1$. + + \begin{tikzpicture} + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-5,ymax=5, + xtick={-8,-6,...,8}, + minor ytick={-3,-1,...,3}, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot] expression[domain=-10:3.666]{(x+3)/(x-5)}; + \addplot[pccplot] expression[domain=7:10]{(x+3)/(x-5)}; + \addplot[asymptote,domain=-5:5]({5},{x}); + \addplot[asymptote,domain=-10:10]({x},{1}); + \addplot[soldot]coordinates{(0,-3/5)(-3,0)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=\dfrac{2x+3}{3x-1}$ + \begin{shortsolution} + Vertical intercept: $(0,-3)$; horizontal intercept: $\left( -\frac{3}{2},0 \right)$; + vertical asymptote: $x=\frac{1}{3}$, horizontal asymptote: $y=\frac{2}{3}$. + + \begin{tikzpicture}[/pgf/declare function={f=(2*x+3)/(3*x-1);}] + \begin{axis}[ + framed, + xmin=-5,xmax=5, + ymin=-5,ymax=5, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot] expression[domain=-5:0.1176]{f}; + \addplot[pccplot] expression[domain=0.6153:5]{f}; + \addplot[asymptote,domain=-5:5]({1/3},{x}); + \addplot[asymptote,domain=-5:5]({x},{2/3}); + \addplot[soldot]coordinates{(0,-3)(-3/2,0)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=\dfrac{4-x^2}{x^2-9}$ + \begin{shortsolution} + Vertical intercept: $\left( 0,-\frac{4}{9} \right)$; + horizontal intercepts: $(2,0)$, $(-2,0)$; + vertical asymptotes: $x=-3$, $x=3$; horizontal asymptote: $y=-1$. + + \begin{tikzpicture}[/pgf/declare function={f=(4-x^2)/(x^2-9);}] + \begin{axis}[ + framed, + xmin=-5,xmax=5, + ymin=-5,ymax=5, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot] expression[domain=-5:-3.20156]{f}; + \addplot[pccplot,samples=50] expression[domain=-2.85774:2.85774]{f}; + \addplot[pccplot] expression[domain=3.20156:5]{f}; + \addplot[asymptote,domain=-5:5]({-3},{x}); + \addplot[asymptote,domain=-5:5]({3},{x}); + \addplot[asymptote,domain=-5:5]({x},{-1}); + \addplot[soldot] coordinates{(-2,0)(2,0)(0,-4/9)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=\dfrac{(4x+5)(3x-4)}{(2x+5)(x-5)}$ + \begin{shortsolution} + Vertical intercept: $\left( 0,\frac{4}{5} \right)$; + horizontal intercepts: $\left( -\frac{5}{4},0 \right)$, $\left( \frac{4}{3},0 \right)$; + vertical asymptotes: $x=-\frac{5}{2}$, $x=5$; horizontal asymptote: $y=6$. + + \begin{tikzpicture}[/pgf/declare function={f=(4*x+5)*(3*x-4)/((2*x+5)*(x-5));}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-20,ymax=20, + xtick={-8,-6,...,8}, + ytick={-10,0,...,10}, + minor ytick={-15,-5,...,15}, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot] expression[domain=-10:-2.73416]{f}; + \addplot[pccplot] expression[domain=-2.33689:4.2792]{f}; + \addplot[pccplot] expression[domain=6.26988:10]{f}; + \addplot[asymptote,domain=-20:20]({-5/2},{x}); + \addplot[asymptote,domain=-20:20]({5},{x}); + \addplot[asymptote,domain=-10:10]({x},{6}); + \addplot[soldot]coordinates{(0,4/5)(-5/4,0)(4/3,0)}; + \end{axis} + \end{tikzpicture} + \end{shortsolution} + \end{subproblem} + \end{multicols} + \end{problem} + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{problem}[Inverse functions] + Each of the following rational functions are invertible + \[ + F(x)=\frac{2x+1}{x-3}, \qquad G(x)= \frac{1-4x}{x+3} + \] + \begin{subproblem} + State the domain of each function. + \begin{shortsolution} + \begin{itemize} + \item The domain of $F$ is $(-\infty,3)\cup(3,\infty)$. + \item The domain of $G$ is $(-\infty,-3)\cup(-3,\infty)$. + \end{itemize} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Find the inverse of each function, and state its domain. + \begin{shortsolution} + \begin{itemize} + \item $F^{-1}(x)=\frac{3x+1}{x-2}$; the domain of $F^{-1}$ is $(-\infty,2)\cup(2,\infty)$. + \item $G^{-1}(x)=\frac{3x+1}{x+4}$; the domain of $G^{-1}$ is $(-\infty,-4)\cup(-4,\infty)$. + \end{itemize} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + Hence state the range of the original functions. + \begin{shortsolution} + \begin{itemize} + \item The range of $F$ is the domain of $F^{-1}$, which is $(-\infty,2)\cup(2,\infty)$. + \item The range of $G$ is the domain of $G^{-1}$, which is $(-\infty,-4)\cup(-4,\infty)$. + \end{itemize} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + State the range of each inverse function. + \begin{shortsolution} + \begin{itemize} + \item The range of $F^{-1}$ is the domain of $F$, which is $(-\infty,3)\cup(3,\infty)$. + \item The range of $G^{-1}$ is the domain of $G$, which is $(-\infty,-3)\cup(-3,\infty)$. + \end{itemize}<++> + \end{shortsolution} + \end{subproblem} + \end{problem} + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{problem}[Composition] + Let $r$ and $s$ be the rational functions that have formulas + \[ + r(x)=\frac{3}{x^2},\qquad s(x)=\frac{4-x}{x+5} + \] + Evaluate each of the following. + \begin{multicols}{3} + \begin{subproblem} + $(r\circ s)(0)$ + \begin{shortsolution} + $\frac{75}{16}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(s\circ r)(0)$ + \begin{shortsolution} + $(s\circ r)(0)$ is undefined. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(r\circ s)(2)$ + \begin{shortsolution} + $\frac{147}{4}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(s\circ r)(3)$ + \begin{shortsolution} + $192$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(s\circ r)(4)$ + \begin{shortsolution} + $(s\circ r)(4)$ is undefined. + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $(s\circ r)(x)$ + \begin{shortsolution} + $\dfrac{4x^2-3}{1+5x^2}$ + \end{shortsolution} + \end{subproblem} + \end{multicols} + \end{problem} + %=================================== + % Author: Hughes + % Date: March 2012 + %=================================== + \begin{problem}[Piecewise rational functions] + The function $R$ has formula + \[ + R(x)= + \begin{dcases} + \frac{2}{x+3}, & x<-5 \\ + \frac{x-4}{x-10}, & x\geq -5 + \end{dcases} + \] + Evaluate each of the following. + \begin{multicols}{4} + \begin{subproblem} + $R(-6)$ + \begin{shortsolution} + $-\frac{2}{3}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $R(-5)$ + \begin{shortsolution} + $\frac{3}{5}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $R(-3)$ + \begin{shortsolution} + $\frac{7}{13}$ + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $R(5)$ + \begin{shortsolution} + $-\frac{1}{5}$ + \end{shortsolution} + \end{subproblem} + \end{multicols} + \begin{subproblem} + What is the domain of $R$? + \begin{shortsolution} + $(-\infty,10)\cup(10,\infty)$ + \end{shortsolution} + \end{subproblem} + \end{problem} + \end{exercises} + +\section{Graphing rational functions (oblique asymptotes)}\label{rat:sec:oblique} + \begin{subproblem} + $y=\dfrac{x^2+1}{x-4}$ + \begin{shortsolution} + \begin{enumerate} + \item $\left( 0,-\frac{1}{4} \right)$ + \item Vertical asymptote: $x=4$. + \item A graph of the function is shown below + + \begin{tikzpicture}[/pgf/declare function={f=(x^2+1)/(x-4);}] + \begin{axis}[ + framed, + xmin=-20,xmax=20, + ymin=-30,ymax=30, + xtick={-10,10}, + minor xtick={-15,-5,...,15}, + minor ytick={-10,10}, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot,samples=50] expression[domain=-20:3.54724]{f}; + \addplot[pccplot,samples=50] expression[domain=4.80196:20]{f}; + \addplot[asymptote,domain=-30:30]({4},{x}); + \end{axis} + \end{tikzpicture} + \end{enumerate} + \end{shortsolution} + \end{subproblem} + \begin{subproblem} + $y=\dfrac{x^3(x+3)}{x-5}$ + \begin{shortsolution} + \begin{enumerate} + \item $(0,0)$, $(-3,0)$ + \item Vertical asymptote: $x=5$, horizontal asymptote: none. + \item A graph of the function is shown below + + \begin{tikzpicture}[/pgf/declare function={f=x^3*(x+3)/(x-5);}] + \begin{axis}[ + framed, + xmin=-10,xmax=10, + ymin=-500,ymax=2500, + xtick={-8,-6,...,8}, + ytick={500,1000,1500,2000}, + grid=both, + width=\solutionfigurewidth, + ] + \addplot[pccplot,samples=50] expression[domain=-10:4]{f}; + \addplot[pccplot] expression[domain=5.6068:9.777]{f}; + \addplot[asymptote,domain=-500:2500]({5},{x}); + \end{axis} + \end{tikzpicture} + \end{enumerate} + \end{shortsolution} + \end{subproblem} diff --git a/Master/texmf-dist/doc/support/latexindent/success/stylefile.tex b/Master/texmf-dist/doc/support/latexindent/success/stylefile.tex new file mode 100644 index 00000000000..fb1154d3420 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/stylefile.tex @@ -0,0 +1,132 @@ +% http://tex.stackexchange.com/questions/106244/using-a-lot-of-marginpars +\ProvidesPackage{tabto}[2013/03/25 \space v 1.3 \space +Another tabbing mechanism]\relax + +\newdimen\CurrentLineWidth +\let\TabPrevPos\z@ + +\newcommand\tabto[1]{% + \leavevmode + \begingroup + \def\@tempa{*}\def\@tempb{#1}% + \ifx\@tempa\@tempb % \tab* + \endgroup + \TTo@overlaptrue % ... set a flag and re-issue \tabto to get argument + \expandafter\tabto + \else + \ifinner % in a \hbox, so ignore + \else % unrestricted horizontal mode + \null% \predisplaysize will tell the position of this box (must be box) + \parfillskip\fill + \everydisplay{}\everymath{}% + \predisplaypenalty\@M \postdisplaypenalty\@M + $$% math display so we can test \predisplaysize + \lineskiplimit=-999pt % so we get pure \baselineskip + \abovedisplayskip=-\baselineskip \abovedisplayshortskip=-\baselineskip + \belowdisplayskip\z@skip \belowdisplayshortskip\z@skip + \halign{##\cr\noalign{% + % get the width of the line above + %\message{>>> Line \the\inputlineno\space -- \predisplaydirection\the\predisplaydirection, \predisplaysize\the\predisplaysize, \displayindent\the\displayindent, \leftskip\the\leftskip, \linewidth\the\linewidth. }% + \ifdim\predisplaysize=\maxdimen % mixed R and L; call the line full + \message{Mixed R and L, so line is full. }% + \CurrentLineWidth\linewidth + \else + \ifdim\predisplaysize=-\maxdimen % impossible, in vmode; call the line empty + \message{Not in paragraph, so line is empty. }% + \CurrentLineWidth\z@ + \else + \ifnum\TTo@Direction<\z@ + \CurrentLineWidth\linewidth \advance\CurrentLineWidth\predisplaysize + \else + \CurrentLineWidth\predisplaysize + \fi + % Correct the 2em offset + \advance\CurrentLineWidth -2em + \advance\CurrentLineWidth -\displayindent + \advance\CurrentLineWidth -\leftskip + \fi\fi + \ifdim\CurrentLineWidth<\z@ \CurrentLineWidth\z@\fi + % Enshrine the tab-to position; #1 might reference \CurrentLineWidth + \@tempdimb=#1\relax + \message{*** Tab to \the\@tempdimb, previous width is \the\CurrentLineWidth. ***}% + % Save width for possible return use + \xdef\TabPrevPos{\the\CurrentLineWidth}% + % Build the action to perform + \protected@xdef\TTo@action{% + \vrule\@width\z@\@depth\the\prevdepth + \ifdim\CurrentLineWidth>\@tempdimb + \ifTTo@overlap\else + \protect\newline \protect\null + \fi\fi + \protect\nobreak + \protect\hskip\the\@tempdimb\relax + }% + %\message{\string\TTo@action: \meaning \TTo@action. }% + % get back to the baseline, regardless of its depth. + \vskip-\prevdepth + \prevdepth-99\p@ + \vskip\prevdepth + }}% + $$ + % Don't count the display as lines in the paragraph + \count@\prevgraf \advance\count@-4 \prevgraf\count@ + \TTo@action + %% \penalty\@m % to allow a penalized line break + \fi + \endgroup + \TTo@overlapfalse + \ignorespaces + \fi +} + +% \tab -- to the next position +% \hskip so \tab\tab moves two positions +% Allow a (penalized but flexible) line-break right after the tab. +% +\newcommand\tab{\leavevmode\hskip2sp\tabto{\NextTabStop}% + \nobreak\hskip\z@\@plus 30\p@\penalty4000\hskip\z@\@plus-30\p@\relax} + + +% Expandable macro to select the next tab position from the list + +\newcommand\NextTabStop{% + \expandafter \TTo@nexttabstop \TabStopList,\maxdimen,>% +} + +\def\TTo@nexttabstop #1,{% + \ifdim#1<\CurrentLineWidth + \expandafter\TTo@nexttabstop + \else + \ifdim#1<0.9999\linewidth#1\else\z@\fi + \expandafter\strip@prefix + \fi +} +\def\TTo@foundtabstop#1>{} + +\newcommand\TabPositions[1]{\def\TabStopList{\z@,#1}} + +\newcommand\NumTabs[1]{% + \def\TabStopList{}% + \@tempdimb\linewidth + \divide\@tempdimb by#1\relax + \advance\@tempdimb 1sp % counteract rounding-down by \divide + \CurrentLineWidth\z@ + \@whiledim\CurrentLineWidth<\linewidth\do {% + \edef\TabStopList{\TabStopList\the\CurrentLineWidth,}% + \advance\CurrentLineWidth\@tempdimb + }% + \edef\TabStopList{\TabStopList\linewidth}% +} + +% default setting of tab positions: +\TabPositions{\parindent,.5\linewidth} + +\newif\ifTTo@overlap \TTo@overlapfalse + +\@ifundefined{predisplaydirection}{ + \let\TTo@Direction\predisplaysize + \let\predisplaydirection\@undefined +} +{ + \let\TTo@Direction\predisplaydirection +} diff --git a/Master/texmf-dist/doc/support/latexindent/success/table1.tex b/Master/texmf-dist/doc/support/latexindent/success/table1.tex new file mode 100644 index 00000000000..5002f8b81a6 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/table1.tex @@ -0,0 +1,22 @@ +% arara: indent: {overwrite: true, silent: on} +\documentclass{article} +\usepackage{multirow} +\usepackage{booktabs} +\begin{document} +\begin{table}[h!] + \centering + \caption{mycaption} + \label{tab:test} + \begin{tabular}{llll} + \toprule + \textbf{headerone} & \textbf{headertwo} & \textbf{headerthree} & \textbf{headerfour} \\\midrule + r1c1 & r1c2 & r1c3 & \multirow{4}{*}{norowlinesinthefirstfourrows} \\\cmidrule{1-3} + r2c1 & r2c2 & r2c3 & \\\cmidrule{1-3} + r3c1 & r3c2 & r3c3 & \\\cmidrule{1-3} + r4c1 & r4c2 & r4c3 & \\\midrule + r5c1 & r5c2 & r5c3 & \\\midrule + r6c1 & r6c2 & r6c3 & \\\midrule + r7c1 & r7c2 & r7c3 & \\\bottomrule + \end{tabular} +\end{table} +\end{document} diff --git a/Master/texmf-dist/doc/support/latexindent/success/table2.tex b/Master/texmf-dist/doc/support/latexindent/success/table2.tex new file mode 100644 index 00000000000..cc0c12cc763 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/table2.tex @@ -0,0 +1,26 @@ +% arara: indent: {overwrite: true, silent: yes} +\documentclass{article} +\usepackage{array} % Thanks to Heiko for catching the redundant package loading +\newcolumntype{M}{>{$}c<{$}} + +\begin{document} + +\begin{table}% + \centering + \begin{tabular}{M|MMMMMMMMM} + & A_1 & A_2 & A_3 & A_4 & A_5 & A_6 & A_7 & A_8 & A_9 \\\hline + A_1 & 0 & & & & & & & & \\ + A_2 & & 0 & & & & & & & \\ + A_3 & & & 0 & & & & & & \\ + A_4 & & & & 0 & & & & & \\ + A_5 & & & & & 0 & & & & \\ + A_6 & & & & & & 0 & & & \\ + A_7 & & & & & & & 0 & & \\ + A_8 & & & & & & & & 0 & \\ + A_9 & & & & & & & & & 0 \\ + \end{tabular} + \caption{Some caption} + \label{table:mytable} +\end{table} +\end{document} + diff --git a/Master/texmf-dist/doc/support/latexindent/success/table3.tex b/Master/texmf-dist/doc/support/latexindent/success/table3.tex new file mode 100644 index 00000000000..e4e0940fb80 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/table3.tex @@ -0,0 +1,26 @@ +% arara: pdflatex +% !arara: indent: {overwrite: yes, trace: on} +\documentclass{article} +\usepackage{multirow} + +\begin{document} +\begin{figure*} + \centering + \begin{tabular}{|c|c|c c c c|c|} + \hline + \multicolumn{2}{|c|}{\multirow{2}{*}{$V_{\rm rot}/{\sigma}$}}&\multicolumn{4}{c|}{W1}\\ + \cline{3-6} + \multicolumn{2}{|c|}{}&3&6&9&12\\ + \hline + \multirow{6}{*}{W2} & \multirow{3}{*}{3} & $0.090475\pm 0.011115$ & \multirow{3}{*}{21} & \multirow{3}{*}{6} & \multirow{3}{*}{3} \\ + & & $0.14861\pm 0.03562$ & & & \\ + & & $0.1861 \pm 0.01728$ & & & \\ + & 6 & 8 & 14 & 5 & 2 \\ + & 9 & 8 & 14 & 5 & 2 \\ + & 12 & 8 & 14 & 5 & 2 \\ + \hline + \end{tabular} + \caption{Multirow in multirow} + \label{ta.Multirow} +\end{figure*} +\end{document} diff --git a/Master/texmf-dist/doc/support/latexindent/success/testHeadings.tex b/Master/texmf-dist/doc/support/latexindent/success/testHeadings.tex new file mode 100644 index 00000000000..3c766b3e77f --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/testHeadings.tex @@ -0,0 +1,59 @@ +% arara: indent: {onlyDefault: no, overwrite: true, trace: on, silent: yes, localSettings: true} +\part{part} + part text + part text + \chapter{chapter long title} + chapter text + chapter text + \[ + f(x)=x^2 + \] + \section[for the toc]{section} + section text + section text + \section[for the toc]{section} + section text + section text + \subsection[for the toc]{subsection} + subsection text + subsection text + \subsection[for the toc]{subsection} + subsection text + subsection text + \section[for the toc]{section} + section text + section text + \chapter{chapter} + chapter text + chapter text +\part{part} + part text + part text + \chapter[toc]{chapter title} + chapter text + chapter text + \section[for the toc]{section} + section text + section text + \subsubsection[for the toc]{subsubsection} + subsubsection text + subsubsection text + \paragraph{paragraph} + paragraph text + paragraph text + \subparagraph{subparagraph} + subparagraph text + subparagraph text + \section[for the toc]{section} + section text + section text + \subsubsection[for the toc]{subsubsection} + subsubsection text + subsubsection text + \paragraph{paragraph} + paragraph text + paragraph text + \subparagraph{subparagraph} + subparagraph text + subparagraph text + \chapter[somethingelse]{goes here} diff --git a/Master/texmf-dist/doc/support/latexindent/success/testHeadings1.tex b/Master/texmf-dist/doc/support/latexindent/success/testHeadings1.tex new file mode 100644 index 00000000000..de90829fb5f --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/testHeadings1.tex @@ -0,0 +1,25 @@ +% arara: indent: {overwrite: yes, localSettings: yes, trace: on} +\documentclass[a4paper]{article} +\usepackage{filecontents} +\begin{filecontents} + \begin{document} + hello world + \end{document} +\end{filecontents} +\begin{document} +\section{} + \subsection{} + \subsubsection{} + some text goes here + some text goes here + some text goes here + \begin{verbatim} + \documentclass[<+options+>]{<+class+>} + + \begin{document} + <++> + \end{document} + \end{document} + more text here + \end{verbatim} +\end{document} diff --git a/Master/texmf-dist/doc/support/latexindent/success/theorem.tex b/Master/texmf-dist/doc/support/latexindent/success/theorem.tex new file mode 100644 index 00000000000..524b9dfc6f1 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/theorem.tex @@ -0,0 +1,47 @@ +% arara: indent: {overwrite: on} +\documentclass[12pt,twoside]{report} +\usepackage[margin=2cm]{geometry} +\usepackage{amsmath,amsthm,amssymb} +\usepackage{thmtools} +\usepackage{tikz} +\usepackage[framemethod=TikZ]{mdframed} + +\declaretheoremstyle +[ + spaceabove=0pt, spacebelow=0pt, headfont=\normalfont\bfseries, + notefont=\mdseries, notebraces={(}{)}, headpunct={\newline}, headindent={}, + postheadspace={ }, postheadspace=4pt, bodyfont=\normalfont, qed=$\blacktriangle$, + preheadhook={\begin{mdframed}[style=myframedstyle]}, + postfoothook=\end{mdframed}, +]{mystyle} + +\declaretheorem[style=mystyle,numberwithin=chapter,title=Exemplo]{example} +\mdfdefinestyle{myframedstyle}{% + outermargin = 1.3cm , % + leftmargin = 0pt , rightmargin = 0pt , % + innerleftmargin = 5pt , innerrightmargin = 5pt , % + innertopmargin = 5pt, innerbottommargin = 5pt , % + backgroundcolor = blue!10 , % + align = center , % align the environment itself (left, center, rigth) + nobreak = true, % prevent a frame from splitting + hidealllines = true , % + topline = true , bottomline = true , % + splittopskip = \topskip , splitbottomskip = 0pt , % + skipabove = 0.5\baselineskip , skipbelow = 0.3\baselineskip} + +\begin{document} +\section{Introduction} +Lorem ipsum sed nulla id risus adipiscing vulputate. + +\begin{example} + Um consumidor financiou a compra de um veÃculo pagando 48 parcelas de \$800,00 mensais e a taxa de juros cobrada pela concessionária foi de 1,2\% a.m.. Qual era o valor à vista do automóvel adquirido? + \newline + \textbf{Solução:} + \newline + $PV = 800 \times \left[ \dfrac{1,012^{48}-1}{1,012^{48}\times 0,012} \right] \newline + PV = 800 \times \left[ \dfrac{0,772820}{0,021274} \right] \newline + PV = \$29.061,79$ +\end{example} + +Lorem ipsum sed nulla id risus adipiscing vulputate. +\end{document} diff --git a/Master/texmf-dist/doc/support/latexindent/success/tikz1.tex b/Master/texmf-dist/doc/support/latexindent/success/tikz1.tex new file mode 100644 index 00000000000..36624b91bcb --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/tikz1.tex @@ -0,0 +1,88 @@ +% arara: indent: {overwrite: true, silent: on} +\documentclass[png,border=10pt,tikz]{standalone} +\usepackage{xstring} +\usepackage{tikz} +\usetikzlibrary{calc} + +\pgfkeys{/tikz/.cd, + vertical factor/.initial=0.5, + vertical factor/.get=\vertfactor, + vertical factor/.store in=\vertfactor, + start coordinate/.initial={0,\vertfactor}, + start coordinate/.get=\startcoord, + start coordinate/.store in=\startcoord, + sample color/.initial=black, + sample color/.get=\samplecol, + sample color/.store in=\samplecol, + sample size/.initial=1pt, + sample size/.get=\samplesize, + sample size/.store in=\samplesize, + sample line width/.initial=very thick, + sample line width/.get=\samplelinewidth, + sample line width/.store in=\samplelinewidth, +} + + +\newcommand{\samplepath}[1]{% + \coordinate (start) at (\startcoord) ; + \foreach \samples[count=\xi from 1] in {#1}{% + \StrCut{\samples}{|}{\vertdir}{\hordir} + \ifnum\xi=1 + \draw[\samplelinewidth,\samplecol](start) + --++(\hordir,0) coordinate (start); + \else + \IfStrEq{\vertdir}{+}{%true + \draw[\samplelinewidth,\samplecol]($(start)+(0,\vertfactor)$) + --++(\hordir,0)coordinate(start); + }{%false + \relax + } + \IfStrEq{\vertdir}{-}{%true + \draw[\samplelinewidth,\samplecol]($(start)+(0,-\vertfactor)$) + --++(\hordir,0)coordinate(start); + }{%false + \relax + } + \fi + } +} + +\tikzset{sample/.style={ + circle, + inner sep=\samplesize, + fill=\samplecol, + } +} + +\newcommand{\discretesamplepath}[1]{% + \coordinate (start) at (\startcoord) ; + \foreach \samples[count=\xi from 1] in {#1}{% + \StrCut{\samples}{|}{\vertdir}{\hordir} + \ifnum\xi=1 + \path(start)node[sample]{} + --++(\hordir,0) coordinate (start); + \else + \IfStrEq{\vertdir}{+}{%true + \path($(start)+(0,\vertfactor)$)node[sample]{} + --++(\hordir,0)coordinate(start); + }{%false + \relax + } + \IfStrEq{\vertdir}{-}{%true + \path($(start)+(0,-\vertfactor)$)node[sample]{} + --++(\hordir,0)coordinate(start); + }{%false + \relax + } + \fi + } +} + +\begin{document} +\begin{tikzpicture} + % axis + \draw[-stealth] (0,-1)--(0,4) node[left]{$X(t)$}; + \draw[-stealth] (-1,0)--(5,0) node[below]{$t$}; + \samplepath{+|0.5,+|0.25,-|1.5,+|1,+|0.5,+|0.75} +\end{tikzpicture} +\end{document} diff --git a/Master/texmf-dist/doc/support/latexindent/success/tikz2.tex b/Master/texmf-dist/doc/support/latexindent/success/tikz2.tex new file mode 100644 index 00000000000..5ba03622079 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/tikz2.tex @@ -0,0 +1,61 @@ +% arara: indent: {overwrite: true, silent: on} +% http://tex.stackexchange.com/questions/104528/tikz-shade-also-the-border-of-a-node +\documentclass[tikz,border=10pt,png]{standalone} +\usepackage{tikz} +\usetikzlibrary{calc} +\begin{document} +\tikzset{ + shrink inner sep/.code={ + \pgfkeysgetvalue{/pgf/inner xsep}{\currentinnerxsep} + \pgfkeysgetvalue{/pgf/inner ysep}{\currentinnerysep} + \pgfkeyssetvalue{/pgf/inner xsep}{\currentinnerxsep - 0.5\pgflinewidth} + \pgfkeyssetvalue{/pgf/inner ysep}{\currentinnerysep - 0.5\pgflinewidth} + } +} + +\tikzset{horizontal shaded border/.style args={#1 and #2}{ + append after command={ + \pgfextra{% + \begin{pgfinterruptpath} + \path[rounded corners,left color=#1,right color=#2] + ($(\tikzlastnode.south west)+(-\pgflinewidth,-\pgflinewidth)$) + rectangle + ($(\tikzlastnode.north east)+(\pgflinewidth,\pgflinewidth)$); + \end{pgfinterruptpath} + } + } + }, + vertical shaded border/.style args={#1 and #2}{ + append after command={ + \pgfextra{% + \begin{pgfinterruptpath} + \path[rounded corners,top color=#1,bottom color=#2] + ($(\tikzlastnode.south west)+(-\pgflinewidth,-\pgflinewidth)$) + rectangle + ($(\tikzlastnode.north east)+(\pgflinewidth,\pgflinewidth)$); + \end{pgfinterruptpath} + } + } + } +} +\begin{tikzpicture} + \draw (0,0) node[rectangle, + rounded corners, + thick, + outer sep=0pt, + shrink inner sep, + left color=red!50!white, + right color=green!50!white, + horizontal shaded border=red and green + ](A){abcabc abc}; + \draw (2.5,0) node[rectangle, + rounded corners, + thick, + outer sep=0pt, + shrink inner sep, + top color=cyan!50, + bottom color=orange!50, + vertical shaded border=blue and orange + ](A){abcabc abc}; +\end{tikzpicture} +\end{document} diff --git a/Master/texmf-dist/doc/support/latexindent/success/tikz3.tex b/Master/texmf-dist/doc/support/latexindent/success/tikz3.tex new file mode 100644 index 00000000000..f50646ac5c8 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/tikz3.tex @@ -0,0 +1,53 @@ +% arara: indent: {overwrite: true, silent: on} +\documentclass[11pt]{article} +\usepackage{tikz} +\usetikzlibrary{trees} +\usetikzlibrary{decorations.pathmorphing} +\usetikzlibrary{decorations.markings} + +\begin{document} + +\tikzset{ + photon/.style={decorate, decoration={snake}, draw=red}, + particle/.style={draw=blue, postaction={decorate}, + decoration={markings,mark=at position .5 with {\arrow[draw=blue]{>}}}}, + antiparticle/.style={draw=blue, postaction={decorate}, + decoration={markings,mark=at position .5 with {\arrow[draw=blue]{<}}}}, + gluon/.style={decorate, draw=black, + decoration={coil,amplitude=4pt, segment length=5pt}} +} + +\begin{tikzpicture}[ + thick, + % Set the overall layout of the tree + level/.style={level distance=1.5cm}, + level 2/.style={sibling distance=3.5cm}, + ] + \coordinate + child[grow=down]{ + edge from parent [antiparticle] + child { + node{$E$} + edge from parent [particle] + } + child { + node{$D$} + edge from parent [gluon] + } + node [above=3pt] {$C$} + } + % I have to insert a dummy child to get the tree to grow + % correctly to the right. + child[grow=right, level distance=0pt] { + child { + node{$A$} + edge from parent [gluon] + } + child { + node{$B$} + edge from parent [particle] + } + }; +\end{tikzpicture} + +\end{document} diff --git a/Master/texmf-dist/doc/support/latexindent/success/tikz4.tex b/Master/texmf-dist/doc/support/latexindent/success/tikz4.tex new file mode 100644 index 00000000000..97830271b3f --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/tikz4.tex @@ -0,0 +1,27 @@ +% arara: indent: {overwrite: true, silent: on} +\documentclass{article} + +% in the preamble +% nothing +% should happend +\foreach \x in {0,1,2,3,4}{ + \foreach \y in {0,1,2,3,4}{ + \foreach \z in {0,1,2,3,4}{ + \fill[black] (\x, \y, \z) circle (0.1); + } + } +}; +\usepackage{tikz} + +\begin{document} +\begin{tikzpicture} + \foreach \x in {0,1,2,3,4}{ + \foreach \y in {0,1,2,3,4}{ + \foreach \z in {0,1,2,3,4}{ + \fill[black] (\x, \y, \z) circle (0.1); + } + } + }; +\end{tikzpicture} +\end{document} + diff --git a/Master/texmf-dist/doc/support/latexindent/success/tikz5.tex b/Master/texmf-dist/doc/support/latexindent/success/tikz5.tex new file mode 100644 index 00000000000..b24b429e318 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/tikz5.tex @@ -0,0 +1,34 @@ +% arara: indent: {overwrite: yes} +\documentclass[professionalfont, fleqn]{beamer} +\mode<presentation> +\usetheme{Warsaw} +\usetheme{CambridgeUS} + +\usepackage{pgfplots} +\usetikzlibrary{arrows,shapes,positioning} +\graphicspath{{graphics/}} + +\begin{document} +\frame +{ + \frametitle{Frame Title} + \begin{tikzpicture} + \begin{axis} + [ + axis x line = bottom, + axis y line = left, + width = 1.01\textwidth, + height = .63\textwidth, % Adjusted + ymax = 93, + ymin = 27, + ytick = {30,40,...,90}, + xmax = 1993, + xmin = 1967, + xtick = {1970, 1980, ..., 1990}, + ] + \node[anchor=west] at (axis cs:1968.5,89.5){% + \textbullet\ Comment here about data + }; + \end{axis} + \end{tikzpicture} +} diff --git a/Master/texmf-dist/doc/support/latexindent/success/torusPGF.tex b/Master/texmf-dist/doc/support/latexindent/success/torusPGF.tex new file mode 100644 index 00000000000..2f8ac9b7d5f --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/torusPGF.tex @@ -0,0 +1,20 @@ +% arara: indent: {overwrite: yes} +\documentclass{article} +\usepackage{pgfplots} + +\begin{document} + +\begin{tikzpicture} + \begin{axis} + \addplot3[surf, + colormap/cool, + samples=20, + domain=0:2*pi,y domain=0:2*pi, + z buffer=sort] + ({(2+cos(deg(x)))*cos(deg(y+pi/2))}, + {(2+cos(deg(x)))*sin(deg(y+pi/2))}, + {sin(deg(x))}); + \end{axis} +\end{tikzpicture} + +\end{document} diff --git a/Master/texmf-dist/doc/support/latexindent/success/torusPSTricks.tex b/Master/texmf-dist/doc/support/latexindent/success/torusPSTricks.tex new file mode 100644 index 00000000000..7e3fc4bd501 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/torusPSTricks.tex @@ -0,0 +1,18 @@ +% arara: indent: {overwrite: on, silent: yes} +\documentclass{article} +\usepackage{pst-solides3d} +\begin{document} + +\begin{pspicture}(-3,-4)(3,6) + \psset{viewpoint=20 40 40 rtp2xyz,Decran=30,lightsrc=20 10 10} + \defFunction[algebraic]{torus}(u,v) + {(2+cos(u))*cos(v+\Pi)} + {(2+cos(u))*sin(v+\Pi)} + {sin(u)} + \psSolid[object=surfaceparametree, + base=-10 10 0 6.28,fillcolor=black!70,incolor=orange, + function=torus,ngrid=60 0.4, + opacity=0.25] +\end{pspicture} + +\end{document} diff --git a/Master/texmf-dist/doc/support/latexindent/success/trailingComments.tex b/Master/texmf-dist/doc/support/latexindent/success/trailingComments.tex new file mode 100644 index 00000000000..bc0d613c717 --- /dev/null +++ b/Master/texmf-dist/doc/support/latexindent/success/trailingComments.tex @@ -0,0 +1,7 @@ +% arara: indent: {overwrite: yes, trace: true} +\parbox{% more comments here + some stuff% comments go here + some \% stuff this is not a comment +} +some stuff +some stuff diff --git a/Master/texmf-dist/scripts/latexindent/defaultSettings.yaml b/Master/texmf-dist/scripts/latexindent/defaultSettings.yaml new file mode 100755 index 00000000000..457629ce863 --- /dev/null +++ b/Master/texmf-dist/scripts/latexindent/defaultSettings.yaml @@ -0,0 +1,181 @@ +# +# defaultSettings.yaml +# +# You're welcome to change anything you like in here, but +# it would probably be better to have your own user settings +# files somewhere else- remember that this file may be overwritten +# anytime that you update your distribution. Please see the manual +# for details of how to setup your own settings files. +# +# Please read the manual first to understand what each switch does :) + +# Default value of indentation +defaultIndent: "\t" + +# default file extension of backup file (if original is overwritten with -w switch) +# for example, if your .tex file is called +# myfile.tex +# and you specify the backupExtension as BACKUP.bak then your +# backup file will be +# myfileBACKUP.bak +backupExtension: .bak + +# only one backup per file; if onlyOneBackUp is 0 then the +# number on the extension increments by 1 each time +# (this is in place as a safety measure) myfile.bak0, myfile.bak1, myfile.bak2 +# +# if you set onlyOnebackUp to 1, then the backup file will +# be overwritten each time (not recommended until you trust the script) +onlyOneBackUp: 0 + +# some users may only want a set number of backup files, +# say at most 3; in which case, they can change this switch. +# If maxNumberOfBackUps is set to 0 (or less) then infinitely +# many backups are possible, unless onlyOneBackUp is switched on +maxNumberOfBackUps: 0 + +# indent preamble +indentPreamble: 0 + +# always look for split { }, which means that the user doesn't +# have to complete checkunmatched, checkunmatchedELSE +alwaysLookforSplitBraces: 1 + +# always look for split [ ], which means that the user doesn't +# have to complete checkunmatchedbracket +alwaysLookforSplitBrackets: 1 + +# remove trailing whitespace from all lines +removeTrailingWhitespace: 0 + +# environments that have tab delimiters, add more +# as needed +lookForAlignDelims: + tabular: 1 + tabularx: 1 + array: 1 + matrix: 1 + bmatrix: 1 + pmatrix: 1 + align: 1 + align*: 1 + alignat: 1 + alignat*: 1 + aligned: 1 + cases: 1 + dcases: 1 + pmatrix: 1 + listabla: 1 + +# if you have indent rules for particular environments +# or commands, put them in here; for example, you might just want +# to use a space " " or maybe a double tab "\t\t" +indentRules: + myenvironment: "\t\t" + anotherenvironment: "\t\t\t\t" + chapter: " " + section: " " + +# verbatim environments- environments specified +# in this hash table will not be changed at all! +verbatimEnvironments: + verbatim: 1 + lstlisting: 1 + +# no indent blocks (not necessarily verbatim +# environments) which are marked as %\begin{noindent} +# or anything else that the user puts in this hash +# table +noIndentBlock: + noindent: 1 + cmhtest: 1 + +# if you don't want to have additional indentation +# in an environment put it in this hash table; note that +# environments in this hash table will inherit +# the *current* level of indentation they just won't +# get any *additional*. +noAdditionalIndent: + myexample: 1 + mydefinition: 1 + problem: 1 + exercises: 1 + mysolution: 1 + foreach: 0 + widepage: 1 + comment: 1 + \[: 0 + \]: 0 + document: 1 + frame: 0 + +# if you want to add indentation after +# a heading, such as \part, \chapter, etc +# then populate it in here - you can add +# an indent rule to indentRules if you would +# like something other than defaultIndent +# +# you can also change the level if you like, +# or add your own title command +indentAfterHeadings: + part: + indent: 0 + level: 1 + chapter: + indent: 0 + level: 2 + section: + indent: 0 + level: 3 + subsection: + indent: 0 + level: 4 + subsection*: + indent: 0 + level: 4 + subsubsection: + indent: 0 + level: 5 + paragraph: + indent: 0 + level: 6 + subparagraph: + indent: 0 + level: 7 + +# *** NOTE *** +# If you have specified alwaysLookforSplitBraces: 1 +# and alwaysLookforSplitBrackets: 1 then you don't need +# to worry about completing +# +# checkunmatched +# checkunmatchedELSE +# checkunmatchedbracket +# +# in other words, you don't really need to edit anything +# below this line- it used to be necessary for older +# versions of the script, but not anymore :) +#*** *** + +# commands that might split {} across lines +# such as \parbox, \marginpar, etc +checkunmatched: + parbox: 1 + vbox: 1 + +# very similar to %checkunmatched except these +# commands might have an else construct +checkunmatchedELSE: + pgfkeysifdefined: 1 + DTLforeach: 1 + ifthenelse: 1 + +# commands that might split [] across lines +# such as \pgfplotstablecreatecol, etc +checkunmatchedbracket: + pgfplotstablecreatecol: 1 + pgfplotstablesave: 1 + pgfplotstabletypeset: 1 + mycommand: 1 + psSolid: 1 + diff --git a/Master/texmf-dist/scripts/latexindent/latexindent.pl b/Master/texmf-dist/scripts/latexindent/latexindent.pl new file mode 100755 index 00000000000..74ab7ebb3e5 --- /dev/null +++ b/Master/texmf-dist/scripts/latexindent/latexindent.pl @@ -0,0 +1,1784 @@ +#!/usr/bin/perl +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# See http://www.gnu.org/licenses/. +# +# For details of how to use this file, please see readme.txt + +# load packages/modules +use strict; +use warnings; +use FindBin; # help find defaultSettings.yaml +use YAML::Tiny; # interpret defaultSettings.yaml +use File::Copy; # to copy the original file to backup (if overwrite option set) +use File::Basename; # to get the filename and directory path +#use Getopt::Std; +use Getopt::Long; # to get the switches/options/flags +use File::HomeDir; # to get users home directory, regardless of OS + +# get the options +my $overwrite; +my $outputToFile; +my $silentMode; +my $tracingMode; +my $readLocalSettings; +my $onlyDefault; +my $showhelp; +my $cruftDirectory='./'; + +GetOptions ("w"=>\$overwrite, +"o"=>\$outputToFile, +"s"=>\$silentMode, +"t"=>\$tracingMode, +"l"=>\$readLocalSettings, +"d"=>\$onlyDefault, +"h"=>\$showhelp, +"c=s"=>\$cruftDirectory, +); + +die "Could not find directory $cruftDirectory\nExiting, no indentation done." if(!(-d $cruftDirectory)); + +# version number +my $versionNumber = "1.1R"; + +# Check the number of input arguments- if it is 0 then simply +# display the list of options (like a manual) +if(scalar(@ARGV) < 1 or $showhelp) +{ + print <<ENDQUOTE +latexindent.pl version $versionNumber +usage: latexindent.pl [options] [file][.tex] + -h help (see the documentation for detailed instructions and examples) + -o output to another file; sample usage + latexindent.pl -o myfile.tex outputfile.tex + -w overwrite the current file- a backup will be made, but still be careful + -s silent mode- no output will be given to the terminal + -t tracing mode- verbose information given to the log file + -l use localSettings.yaml (assuming it exists in the directory of your file) + -d ONLY use defaultSettings.yaml, ignore ALL user files + -c=cruft directory used to specify the location of backup files and indent.log +ENDQUOTE + ; + exit(2); +} + + +# we'll be outputting to the logfile and to standard output +my $logfile; +my $out = *STDOUT; + +# open the log file +open($logfile,">","$cruftDirectory/indent.log") or die "Can't open indent.log"; + +# output time to log file +my $time = localtime(); +print $logfile $time; + +# output version to log file +print $logfile <<ENDQUOTE + +latexindent.pl version $versionNumber, a script to indent .tex files +latexindent.pl lives here: $FindBin::RealBin/ + +Directory for backup files and indent.log: $cruftDirectory + +file: $ARGV[0] +ENDQUOTE +; + +# a quick options check +if($outputToFile and $overwrite) +{ + print $logfile <<ENDQUOTE + +WARNING: +\t You have called latexindent.pl with both -o and -w +\t -o (output to file) will take priority, and -w (over write) will be ignored + +ENDQUOTE +; + $overwrite = 0; +} + +# can't call the script with MORE THAN 2 files +if(scalar(@ARGV)>2) +{ + for my $fh ($out,$logfile) {print $fh <<ENDQUOTE + +ERROR: +\t You're calling latexindent.pl with more than two file names +\t The script can take at MOST two file names, but you +\t need to call it with the -o switch; for example + +\t latexindent.pl -o originalfile.tex outputfile.tex + +No indentation done :( +Exiting... +ENDQUOTE + }; + exit(2); +} + +# don't call the script with 2 files unless the -o flag is active +if(!$outputToFile and scalar(@ARGV)==2) +{ +for my $fh ($out,$logfile) { +print $fh <<ENDQUOTE + +ERROR: +\t You're calling latexindent.pl with two file names, but not the -o flag. +\t Did you mean to use the -o flag ? + +No indentation done :( +Exiting... +ENDQUOTE +}; + exit(2); +} + +# if the script is called with the -o switch, then check that +# a second file is present in the call, e.g +# latexindent.pl -o myfile.tex output.tex +if($outputToFile and scalar(@ARGV)==1) +{ + for my $fh ($out,$logfile) {print $fh <<ENDQUOTE +ERROR: When using the -o flag you need to call latexindent.pl with 2 arguments + +latexindent.pl -o "$ARGV[0]" [needs another name here] + +No indentation done :( +Exiting... +ENDQUOTE +}; + exit(2); +} + + +# Read in YAML file +my $defaultSettings = YAML::Tiny->new; + +print $logfile "Reading defaultSettings.yaml from $FindBin::Bin/defaultSettings.yaml\n\n"; + +# Open defaultSettings.yaml +$defaultSettings = YAML::Tiny->read( "$FindBin::Bin/defaultSettings.yaml" ); + +if(!$defaultSettings) +{ + for my $fh ($out,$logfile) { + print $fh <<ENDQUOTE + ERROR There seems to be a yaml formatting error in defaultSettings.yaml + Please check it for mistakes- you can find a working version at https://github.com/cmhughes/latexindent.plx + if you would like to overwrite your current version + + Exiting, no indendation done. +ENDQUOTE +}; + exit(2); +} + +# setup the DEFAULT variables and hashes from the YAML file + +# scalar variables +my $defaultIndent = $defaultSettings->[0]->{defaultIndent}; +my $alwaysLookforSplitBraces = $defaultSettings->[0]->{alwaysLookforSplitBraces}; +my $alwaysLookforSplitBrackets = $defaultSettings->[0]->{alwaysLookforSplitBrackets}; +my $backupExtension = $defaultSettings->[0]->{backupExtension}; +my $indentPreamble = $defaultSettings->[0]->{indentPreamble}; +my $onlyOneBackUp = $defaultSettings->[0]->{onlyOneBackUp}; +my $maxNumberOfBackUps = $defaultSettings->[0]->{maxNumberOfBackUps}; +my $removeTrailingWhitespace = $defaultSettings->[0]->{removeTrailingWhitespace}; + +# hash variables +my %lookForAlignDelims= %{$defaultSettings->[0]->{lookForAlignDelims}}; +my %indentRules= %{$defaultSettings->[0]->{indentRules}}; +my %verbatimEnvironments= %{$defaultSettings->[0]->{verbatimEnvironments}}; +my %noIndentBlock= %{$defaultSettings->[0]->{noIndentBlock}}; +my %checkunmatched= %{$defaultSettings->[0]->{checkunmatched}}; +my %checkunmatchedELSE= %{$defaultSettings->[0]->{checkunmatchedELSE}}; +my %checkunmatchedbracket= %{$defaultSettings->[0]->{checkunmatchedbracket}}; +my %noAdditionalIndent= %{$defaultSettings->[0]->{noAdditionalIndent}}; +my %indentAfterHeadings= %{$defaultSettings->[0]->{indentAfterHeadings}}; + +# need new hashes to store the user and local data before +# overwriting the default +my %lookForAlignDelimsUSER; +my %indentRulesUSER; +my %verbatimEnvironmentsUSER; +my %noIndentBlockUSER; +my %checkunmatchedUSER; +my %checkunmatchedELSEUSER; +my %checkunmatchedbracketUSER; +my %noAdditionalIndentUSER; +my %indentAfterHeadingsUSER; + +# for printing the user and local settings to the log file +my %dataDump; + +# empty array to store the paths +my @absPaths; + +# scalar to read user settings +my $userSettings; + +# get information about user settings- first check if indentconfig.yaml exists +my $indentconfig = File::HomeDir->my_home . "/indentconfig.yaml"; +if ( -e $indentconfig and !$onlyDefault ) +{ + print $logfile "Reading path information from ",File::HomeDir->my_home,"/indentconfig.yaml\n"; + + # read the absolute paths from indentconfig.yaml + $userSettings = YAML::Tiny->read( "$indentconfig" ); + + # integrity check + if($userSettings) + { + %dataDump = %{$userSettings->[0]}; + print $logfile Dump \%dataDump; + print $logfile "\n"; + @absPaths = @{$userSettings->[0]->{paths}}; + } + else + { + print $logfile <<ENDQUOTE +WARNING: $indentconfig + contains some invalid .yaml formatting- unable to read from it. + No user settings loaded. +ENDQUOTE +; + } +} +else +{ + if($onlyDefault) + { + print $logfile "Only default settings requested, not reading USER settings from indentconfig.yaml \n"; + print $logfile "Ignoring localSettings.yaml\n" if($readLocalSettings); + $readLocalSettings = 0; + } + else + { + # give the user instructions on where to put indentconfig.yaml + print $logfile "Home directory is ",File::HomeDir->my_home,"\n"; + print $logfile "To specify user settings you would put indentconfig.yaml here: \n\t",File::HomeDir->my_home,"/indentconfig.yaml\n\n"; + } +} + +# get information about LOCAL settings, assuming that localSettings.yaml exists +my $directoryName = dirname $ARGV[0]; + +# add local settings to the paths, if appropriate +if ( (-e "$directoryName/localSettings.yaml") and $readLocalSettings and !(-z "$directoryName/localSettings.yaml")) +{ + print $logfile "\nAdding ./localSettings.yaml to paths\n\n"; + push(@absPaths,"$directoryName/localSettings.yaml"); +} +elsif ( !(-e "$directoryName/localSettings.yaml") and $readLocalSettings) +{ + print $logfile "WARNING\n\t$directoryName/localSettings.yaml not found\n"; + print $logfile "\tcarrying on without it.\n"; +} + +# read in the settings from each file +foreach my $settings (@absPaths) +{ + # check that the settings file exists and that it isn't empty + if (-e $settings and !(-z $settings)) + { + print $logfile "Reading USER settings from $settings\n"; + $userSettings = YAML::Tiny->read( "$settings" ); + + # if we can read userSettings + if($userSettings) + { + # output settings to $logfile + %dataDump = %{$userSettings->[0]}; + print $logfile Dump \%dataDump; + print $logfile "\n"; + + # scalar variables + $defaultIndent = $userSettings->[0]->{defaultIndent} if defined($userSettings->[0]->{defaultIndent}); + $alwaysLookforSplitBraces = $userSettings->[0]->{alwaysLookforSplitBraces} if defined($userSettings->[0]->{alwaysLookforSplitBraces}); + $alwaysLookforSplitBrackets = $userSettings->[0]->{alwaysLookforSplitBrackets} if defined($userSettings->[0]->{alwaysLookforSplitBrackets}); + $backupExtension = $userSettings->[0]->{backupExtension} if defined($userSettings->[0]->{backupExtension}); + $indentPreamble = $userSettings->[0]->{indentPreamble} if defined($userSettings->[0]->{indentPreamble}); + $onlyOneBackUp = $userSettings->[0]->{onlyOneBackUp} if defined($userSettings->[0]->{onlyOneBackUp}); + $maxNumberOfBackUps = $userSettings->[0]->{maxNumberOfBackUps} if defined($userSettings->[0]->{maxNumberOfBackUps}); + $removeTrailingWhitespace = $userSettings->[0]->{removeTrailingWhitespace} if defined($userSettings->[0]->{removeTrailingWhitespace}); + + # hash variables - note that each one requires two lines, + # one to read in the data, one to put the keys&values in correctly + + %lookForAlignDelimsUSER= %{$userSettings->[0]->{lookForAlignDelims}} if defined($userSettings->[0]->{lookForAlignDelims}); + @lookForAlignDelims{ keys %lookForAlignDelimsUSER } = values %lookForAlignDelimsUSER if (%lookForAlignDelimsUSER); + + %indentRulesUSER= %{$userSettings->[0]->{indentRules}} if defined($userSettings->[0]->{indentRules}); + @indentRules{ keys %indentRulesUSER } = values %indentRulesUSER if (%indentRulesUSER); + + %verbatimEnvironmentsUSER= %{$userSettings->[0]->{verbatimEnvironments}} if defined($userSettings->[0]->{verbatimEnvironments}); + @verbatimEnvironments{ keys %verbatimEnvironmentsUSER } = values %verbatimEnvironmentsUSER if (%verbatimEnvironmentsUSER); + + %noIndentBlockUSER= %{$userSettings->[0]->{noIndentBlock}} if defined($userSettings->[0]->{noIndentBlock}); + @noIndentBlock{ keys %noIndentBlockUSER } = values %noIndentBlockUSER if (%noIndentBlockUSER); + + %checkunmatchedUSER= %{$userSettings->[0]->{checkunmatched}} if defined($userSettings->[0]->{checkunmatched}); + @checkunmatched{ keys %checkunmatchedUSER } = values %checkunmatchedUSER if (%checkunmatchedUSER); + + %checkunmatchedbracketUSER= %{$userSettings->[0]->{checkunmatchedbracket}} if defined($userSettings->[0]->{checkunmatchedbracket}); + @checkunmatchedbracket{ keys %checkunmatchedbracketUSER } = values %checkunmatchedbracketUSER if (%checkunmatchedbracketUSER); + + %noAdditionalIndentUSER= %{$userSettings->[0]->{noAdditionalIndent}} if defined($userSettings->[0]->{noAdditionalIndent}); + @noAdditionalIndent{ keys %noAdditionalIndentUSER } = values %noAdditionalIndentUSER if (%noAdditionalIndentUSER); + + %indentAfterHeadingsUSER= %{$userSettings->[0]->{indentAfterHeadings}} if defined($userSettings->[0]->{indentAfterHeadings}); + @indentAfterHeadings{ keys %indentAfterHeadingsUSER } = values %indentAfterHeadingsUSER if (%indentAfterHeadingsUSER); + + } + else + { + # otherwise print a warning that we can not read userSettings.yaml + print $logfile "WARNING\n\t$settings \n\t contains invalid yaml format- not reading from it\n"; + } + + } + else + { + # otherwise keep going, but put a warning in the log file + print $logfile "\nWARNING\n\t",File::HomeDir->my_home,"/indentconfig.yaml\n"; + if (-z $settings) + { + print $logfile "\tspecifies $settings \n\tbut this file is EMPTY- not reading from it\n\n" + } + else + { + print $logfile "\tspecifies $settings \n\tbut this file does not exist- unable to read settings from this file\n\n" + } + } +} + + +# if we want to over write the current file +# create a backup first +if ($overwrite) +{ + print $logfile "\nBackup procedure:\n"; + # original name of file + my $filename = $ARGV[0]; + # copy it + my $backupFile = $filename; + + # add the user's backup directory to the backup path + $backupFile = "$cruftDirectory/$backupFile"; + + # if both ($onlyOneBackUp and $maxNumberOfBackUps) then we have + # a conflict- er on the side of caution and turn off onlyOneBackUp + if($onlyOneBackUp and $maxNumberOfBackUps>1) + { + print $logfile "\t WARNING: onlyOneBackUp=$onlyOneBackUp and maxNumberOfBackUps: $maxNumberOfBackUps\n"; + print $logfile "\t\t setting onlyOneBackUp=0 which will allow you to reach $maxNumberOfBackUps back ups\n"; + $onlyOneBackUp = 0; + } + + # if the user has specified that $maxNumberOfBackUps = 1 then + # they only want one backup + if($maxNumberOfBackUps==1) + { + $onlyOneBackUp=1 ; + print $logfile "\t FYI: you set maxNumberOfBackUps=1, so I'm setting onlyOneBackUp: 1 \n"; + } + elsif($maxNumberOfBackUps<=0 and !$onlyOneBackUp) + { +# print $logfile "\t FYI: maxNumberOfBackUps=$maxNumberOfBackUps which won't have any effect\n"; +# print $logfile "\t on the script- at least ONE backup is made when the -w flag is invoked.\n"; +# print $logfile "\t I'm setting onlyOneBackUp: 0, which means that you'll get a new back up file \n"; +# print $logfile "\t every time you run the script.\n"; + $onlyOneBackUp=0 ; + $maxNumberOfBackUps=-1; + } + + # if onlyOneBackUp is set, then the backup file will + # be overwritten each time + if($onlyOneBackUp) + { + $backupFile =~ s/\.tex/$backupExtension/; + print $logfile "\t copying $filename to $backupFile\n"; + print $logfile "\t $backupFile was overwritten\n\n" if (-e $backupFile); + } + else + { + # start with a backup file .bak0 (or whatever $backupExtension is present) + my $backupCounter = 0; + $backupFile =~ s/\.tex$/$backupExtension$backupCounter/; + + # if it exists, then keep going: .bak0, .bak1, ... + while (-e $backupFile or $maxNumberOfBackUps>1) + { + if($backupCounter==$maxNumberOfBackUps) + { + print $logfile "\t maxNumberOfBackUps reached ($maxNumberOfBackUps)\n"; + $maxNumberOfBackUps=1 ; + last; # break out of the loop + } + elsif(!(-e $backupFile)) + { + $maxNumberOfBackUps=1 ; + last; # break out of the loop + } + print $logfile "\t $backupFile already exists, incrementing by 1...\n"; + $backupCounter++; + $backupFile =~ s/$backupExtension.*/$backupExtension$backupCounter/; + } + print $logfile "\n\t copying $filename to $backupFile\n\n"; + } + + # output these lines to the log file + print $logfile "\t Backup file: ",$backupFile,"\n"; + print $logfile "\t Overwriting file: ",$filename,"\n\n"; + copy($filename,$backupFile) or die "Could not write to backup file $backupFile. Please check permissions. Exiting.\n"; +} + +if(!($outputToFile or $overwrite)) +{ + print $logfile "Just out put to the terminal :)\n\n" if !$silentMode ; +} + + +# scalar variables +my $line; # $line: takes the $line of the file +my $inpreamble=!$indentPreamble; + # $inpreamble: switch to determine if in + # preamble or not +my $inverbatim=0; # $inverbatim: switch to determine if in + # a verbatim environment or not +my $delimiters=0; # $delimiters: switch that governs if + # we need to check for & or not +my $matchedbraces=0; # $matchedbraces: counter to see if { } + # are matched; it will be + # positive if too many { + # negative if too many } + # 0 if matched +my $matchedBRACKETS=0; # $matchedBRACKETS: counter to see if [ ] + # are matched; it will be + # positive if too many { + # negative if too many } + # 0 if matched +my $commandname; # $commandname: either \parbox, \marginpar, + # or anything else from %checkunmatched +my $commanddetails; # $command details: a scalar that stores + # details about the command + # that splits {} across lines +my $countzeros; # $countzeros: a counter that helps + # when determining if we're in + # an else construct +my $lookforelse=0; # $lookforelse: a boolean to help determine + # if we need to look for an + # else construct +my $trailingcomments; # $trailingcomments stores the comments at the end of + # a line +my $lineCounter=0; # $lineCounter keeps track of the line number +my $inIndentBlock=0; # $inindentblock: switch to determine if in + # a inindentblock or not +my $headingLevel=0; # $headingLevel: scalar that stores which heading + # we are under: \part, \chapter, etc + +# array variables +my @indent; # @indent: stores current level of indentation +my @lines; # @lines: stores the newly indented lines +my @block; # @block: stores blocks that have & delimiters +my @commandstore; # @commandstore: stores commands that + # have split {} across lines +my @commandstorebrackets; # @commandstorebrackets: stores commands that + # have split [] across lines +my @mainfile; # @mainfile: stores input file; used to + # grep for \documentclass +my @headingStore; # @headingStore: stores headings: chapter, section, etc +my @indentNames; # @indentNames: keeps names of commands and + # environments that have caused + # indentation to increase +my @environmentStack; # @environmentStack: stores the (nested) names + # of environments + +# check to see if the current file has \documentclass, if so, then +# it's the main file, if not, then it doesn't have preamble +open(MAINFILE, $ARGV[0]) or die "Could not open input file"; + @mainfile=<MAINFILE>; +close(MAINFILE); + +# if the MAINFILE doesn't have a \documentclass statement, then +# it shouldn't have preamble +if(scalar(@{[grep(m/^\s*\\documentclass/, @mainfile)]})==0) +{ + $inpreamble=0; + + print $logfile "Trace:\tNo documentclass detected, assuming no preamble\n" if($tracingMode); +} +else +{ + print $logfile "Trace:\t documentclass detected, assuming preamble\n" if($tracingMode); +} + +# the previous OPEN command puts us at the END of the file +open(MAINFILE, $ARGV[0]) or die "Could not open input file"; + +# loop through the lines in the INPUT file +while(<MAINFILE>) +{ + # increment the line counter + $lineCounter++; + + # tracing mode + print $logfile "\n" if($tracingMode and !($inpreamble or $inverbatim or $inIndentBlock)); + + # check to see if we're still in the preamble + # or in a verbatim environment or in IndentBlock + if(!($inpreamble or $inverbatim or $inIndentBlock)) + { + # if not, remove all leading spaces and tabs + # from the current line, assuming it isn't empty + #s/^\ *//; + #s/^\s+//; + #s/^\t+//; + s/^\t*// if($_ !~ /^((\s*)|(\t*))*$/); + s/^\s*// if($_ !~ /^((\s*)|(\t*))*$/); + + # tracing mode + print $logfile "Line $lineCounter\t removing leading spaces\n" if($tracingMode); + } + else + { + # otherwise check to see if we've reached the main + # part of the document + if(m/^\s*\\begin{document}/) + { + $inpreamble = 0; + + # tracing mode + print $logfile "Line $lineCounter\t \\begin{document} found \n" if($tracingMode); + } + else + { + # tracing mode + if($inpreamble) + { + print $logfile "Line $lineCounter\t still in PREAMBLE, doing nothing\n" if($tracingMode); + } + elsif($inverbatim) + { + print $logfile "Line $lineCounter\t in VERBATIM-LIKE environment, doing nothing\n" if($tracingMode); + } + elsif($inIndentBlock) + { + print $logfile "Line $lineCounter\t in NO INDENT BLOCK, doing nothing\n" if($tracingMode); + } + } + } + + # check to see if we have \end{something} or \] + &at_end_of_env_or_eq() unless ($inpreamble or $inIndentBlock); + + # check to see if we're at the end of a noindent + # block %\end{noindent} + &at_end_noindent(); + + # only check for unmatched braces if we're not in + # a verbatim-like environment or in the preamble or in a + # noIndentBlock + if(!($inverbatim or $inpreamble or $inIndentBlock)) + { + # The check for closing } and ] relies on counting, so + # we have to remove trailing comments so that any {, }, [, ] + # that are found after % are not counted + # + # note that these lines are NOT in @lines, so we + # have to store the $trailingcomments to put + # back on after the counting + # + # note the use of (?<!\\)% so that we don't match \% + if ( $_=~ m/(?<!\\)%.*/) + { + s/((?<!\\)%.*)//; + $trailingcomments=$1; + + # tracing mode + print $logfile "Line $lineCounter\t Removed trailing comments to count braces and brackets: $1\n" if($tracingMode); + } + + # check to see if we're at the end of a \parbox, \marginpar + # or other split-across-lines command and check that + # we're not starting another command that has split braces (nesting) + &end_command_or_key_unmatched_braces(); + + # check to see if we're at the end of a command that splits + # [ ] across lines + &end_command_or_key_unmatched_brackets(); + + # check for a heading + &indent_heading(); + + # add the trailing comments back to the end of the line + if(scalar($trailingcomments)) + { + # some line break magic, http://stackoverflow.com/questions/881779/neatest-way-to-remove-linebreaks-in-perl + s/\R//; + $_ = $_ . $trailingcomments."\n" ; + + # tracing mode + print $logfile "Line $lineCounter\t counting braces/brackets complete: added trailing comments back on $trailingcomments\n" if($tracingMode); + + # empty the trailingcomments + $trailingcomments=''; + + } + } + + # remove trailing whitespace + if ($removeTrailingWhitespace) + { + print $logfile "Line $lineCounter\t removing trailing whitespace\n" if ($tracingMode); + s/\s+$/\n/; + } + + # ADD CURRENT LEVEL OF INDENTATION + # (unless we're in a delimiter-aligned block) + if(!$delimiters) + { + # make sure we're not in a verbatim block or in the preamble + if($inverbatim or $inpreamble or $inIndentBlock) + { + # just push the current line as is + push(@lines,$_); + } + else + { + # add current value of indentation to the current line + # and output it + # unless this would only create trailing whitespace and the + # corresponding option is set + unless ($_ =~ m/^$/ and $removeTrailingWhitespace){ + $_ = join("",@indent).$_; + } + push(@lines,$_); + # tracing mode + print $logfile "Line $lineCounter\t Adding current level of indentation: ",join(", ",@indentNames),"\n" if($tracingMode); + } + } + else + { + # output to @block if we're in a delimiter block + push(@block,$_); + + # tracing mode + print $logfile "Line $lineCounter\t In delimeter block, waiting for block formatting\n" if($tracingMode); + } + + # only check for new environments or commands if we're + # not in a verbatim-like environment or in the preamble + # or in a noIndentBlock, or delimiter block + if(!($inverbatim or $inpreamble or $inIndentBlock or $delimiters)) + { + + # check if we are in a + # % \begin{noindent} + # block; this is similar to a verbatim block, the user + # may not want some blocks of code to be touched + # + # IMPORTANT: this needs to go before the trailing comments + # are removed! + &at_beg_noindent(); + + # remove trailing comments so that any {, }, [, ] + # that are found after % are not counted + # + # note that these lines are already in @lines, so we + # can remove the trailing comments WITHOUT having + # to put them back in + # + # Note that this won't match \% + s/(?<!\\)%.*// if( $_=~ m/(?<!\\)%.*/); + + # tracing mode + print $logfile "Line $lineCounter\t Removing trailing comments for brace count (line is already stored)\n" if($tracingMode); + + # check to see if we have \begin{something} or \[ + &at_beg_of_env_or_eq(); + + # check to see if we have \parbox, \marginpar, or + # something similar that might split braces {} across lines, + # specified in %checkunmatched hash table + &start_command_or_key_unmatched_braces(); + + # check for an else statement + &check_for_else(); + + # check for a command that splits [] across lines + &start_command_or_key_unmatched_brackets(); + + # check for a heading + &indent_after_heading(); + + # tracing mode + print $logfile "Line $lineCounter\t Environments: ",join(", ",@environmentStack),"\n" if($tracingMode and scalar(@environmentStack)); + } +} + +# close the main file +close(MAINFILE); + +# put line count information in the log file +print $logfile "Line Count of $ARGV[0]: ",scalar(@mainfile),"\n"; +print $logfile "Line Count of indented $ARGV[0]: ",scalar(@lines); +if(scalar(@mainfile) != scalar(@lines)) +{ + print $logfile <<ENDQUOTE +WARNING: \t line count of original file and indented file does +\t not match- consider reverting to a back up, see $backupExtension; +ENDQUOTE +; +} +else +{ + print $logfile "\n\nLine counts of original file and indented file match"; +} + +# output the formatted lines to the terminal +print @lines if(!$silentMode); + +# if -w is active then output to $ARGV[0] +if($overwrite) +{ + open(OUTPUTFILE,">",$ARGV[0]); + print OUTPUTFILE @lines; + close(OUTPUTFILE); +} + +# if -o is active then output to $ARGV[1] +if($outputToFile) +{ + open(OUTPUTFILE,">",$ARGV[1]); + print OUTPUTFILE @lines; + close(OUTPUTFILE); +} + +# close the log file +close($logfile); + +exit; + +sub indent_heading{ + # PURPOSE: This matches + # \part + # \chapter + # \section + # \subsection + # \subsubsection + # \paragraph + # \subparagraph + # + # and anything else listed in indentAfterHeadings + # + # This subroutine specifies the indentation for the + # heading itself, i.e the line that has \chapter, \section etc + if( $_ =~ m/^\s*\\(.*?)(\[|{)/ and $indentAfterHeadings{$1}) + { + # tracing mode + print $logfile "Line $lineCounter\t Heading found: $1 \n" if($tracingMode); + + # get the heading settings- it's a hash within a hash + my %currentHeading = %{$indentAfterHeadings{$1}}; + + # local scalar + my $previousHeadingLevel = $headingLevel; + + # if current heading level < old heading level, + if($currentHeading{level}<$previousHeadingLevel) + { + # decrease indentation, but only if + # specified in indentHeadings. Note that this check + # needs to be done here- decrease_indent won't + # check a nested hash + + if(scalar(@headingStore)) + { + while($currentHeading{level}<$previousHeadingLevel and scalar(@headingStore)) + { + my $higherHeadingName = pop(@headingStore); + my %higherLevelHeading = %{$indentAfterHeadings{$higherHeadingName}}; + + # tracing mode + print $logfile "Line $lineCounter\t stepping UP heading level from $higherHeadingName \n" if($tracingMode); + + &decrease_indent($higherHeadingName) if($higherLevelHeading{indent}); + $previousHeadingLevel=$higherLevelHeading{level}; + } + # put the heading name back in to storage + push(@headingStore,$1); + } + } + elsif($currentHeading{level}==$previousHeadingLevel) + { + if(scalar(@headingStore)) + { + my $higherHeadingName = pop(@headingStore); + my %higherLevelHeading = %{$indentAfterHeadings{$higherHeadingName}}; + &decrease_indent($higherHeadingName) if($higherLevelHeading{indent}); + } + # put the heading name back in to storage + push(@headingStore,$1); + } + else + { + # put the heading name into storage + push(@headingStore,$1); + } + } +} + +sub indent_after_heading{ + # PURPOSE: This matches + # \part + # \chapter + # \section + # \subsection + # \subsubsection + # \paragraph + # \subparagraph + # + # and anything else listed in indentAfterHeadings + # + # This subroutine is specifies the indentation for + # the text AFTER the heading, i.e the body of conent + # in each \chapter, \section, etc + if( $_ =~ m/^\s*\\(.*?)(\[|{)/ and $indentAfterHeadings{$1}) + { + # get the heading settings- it's a hash within a hash + my %currentHeading = %{$indentAfterHeadings{$1}}; + + &increase_indent($1) if($currentHeading{indent}); + + # update heading level + $headingLevel = $currentHeading{level}; + } +} + + + +sub at_end_noindent{ + # PURPOSE: This matches + # % \end{noindent} + # with any number of spaces (possibly none) between + # the comment and \end{noindent}. + # + # the comment symbol IS indended! + # + # This is for blocks of code that the user wants + # to leave untouched- similar to verbatim blocks + + if( $_ =~ m/^%\s*\\end{(.*?)}/ and $noIndentBlock{$1}) + { + $inIndentBlock=0; + # tracing mode + print $logfile "Line $lineCounter\t % \\end{no indent block} found, switching inIndentBlock OFF \n" if($tracingMode); + } +} + +sub at_beg_noindent{ + # PURPOSE: This matches + # % \begin{noindent} + # with any number of spaces (possibly none) between + # the comment and \begin{noindent}. + # + # the comment symbol IS indended! + # + # This is for blocks of code that the user wants + # to leave untouched- similar to verbatim blocks + + if( $_ =~ m/^%\s*\\begin{(.*?)}/ and $noIndentBlock{$1}) + { + $inIndentBlock = 1; + # tracing mode + print $logfile "Line $lineCounter\t % \\begin{no indent block} found, switching inIndentBlock ON \n" if($tracingMode); + } +} + +sub start_command_or_key_unmatched_brackets{ + # PURPOSE: This matches + # \pgfplotstablecreatecol[... + # + # or any other command/key that has brackets [ ] + # split across lines specified in the + # hash tables, %checkunmatchedbracket + # + # How to read: ^\s*(\\)?(.*?)(\[\s*) + # + # ^ line begins with + # \s* any (or no)spaces + # (\\)? matches a \ backslash but not necessarily + # (.*?) non-greedy character match and store the result + # ((?<!\\)\[\s*) match [ possibly leading with spaces + # but it WON'T match \[ + + if ($_ =~ m/^\s*(\\)?(.*?)(\s*(?<!\\)\[)/ + and (scalar($checkunmatchedbracket{$2}) + or $alwaysLookforSplitBrackets) + ) + { + # store the command name, because $2 + # will not exist after the next match + $commandname = $2; + $matchedBRACKETS=0; + + # match [ but don't match \[ + $matchedBRACKETS++ while ($_ =~ /(?<!\\)\[/g); + # match ] but don't match \] + $matchedBRACKETS-- while ($_ =~ /(?<!\\)\]/g); + + # set the indentation + if($matchedBRACKETS != 0 ) + { + # tracing mode + print $logfile "Line $lineCounter\t Found opening BRACKET [ $commandname\n" if($tracingMode); + + &increase_indent($commandname); + + # store the command name + # and the value of $matchedBRACKETS + push(@commandstorebrackets,{commandname=>$commandname, + matchedBRACKETS=>$matchedBRACKETS}); + + } + } +} + +sub end_command_or_key_unmatched_brackets{ + # PURPOSE: Check for the closing BRACKET of a command that + # splits its BRACKETS across lines, such as + # + # \pgfplotstablecreatecol[ ... + # + # It works by checking if we have any entries + # in the array @commandstorebrackets, and making + # sure that we're not starting another command/key + # that has split BRACKETS (nesting). + # + # It also checks that the line is not commented. + # + # We count the number of [ and ADD to the counter + # ] and SUBTRACT to the counter + if(scalar(@commandstorebrackets) + and !($_ =~ m/^\s*(\\)?(.*?)(\s*\[)/ + and (scalar($checkunmatchedbracket{$2}) + or $alwaysLookforSplitBrackets)) + and $_ !~ m/^\s*%/ + ) + { + # get the details of the most recent command name + $commanddetails = pop(@commandstorebrackets); + $commandname = $commanddetails->{'commandname'}; + $matchedBRACKETS = $commanddetails->{'matchedBRACKETS'}; + + # match [ but don't match \[ + $matchedBRACKETS++ while ($_ =~ m/(?<!\\)\[/g); + + # match ] but don't match \] + $matchedBRACKETS-- while ($_ =~ m/(?<!\\)\]/g); + + # if we've matched up the BRACKETS then + # we can decrease the indent by 1 level + if($matchedBRACKETS == 0) + { + # tracing mode + print $logfile "Line $lineCounter\t Found closing BRACKET ] $commandname\n" if($tracingMode); + + # decrease the indentation (if appropriate) + &decrease_indent($commandname); + } + else + { + # otherwise we need to enter the new value + # of $matchedBRACKETS and the value of $command + # back into storage + push(@commandstorebrackets,{commandname=>$commandname, + matchedBRACKETS=>$matchedBRACKETS}); + # tracing mode + print $logfile "Line $lineCounter\t Searching for closing BRACKET ] $commandname\n" if($tracingMode); + } + } +} + +sub start_command_or_key_unmatched_braces{ + # PURPOSE: This matches + # \parbox{... + # \parbox[..]..{ + # empty header/.style={ + # \foreach \something + # etc + # + # or any other command/key that has BRACES + # split across lines specified in the + # hash tables, %checkunmatched, %checkunmatchedELSE + # + # How to read: ^\s*(\\)?(.*?)(\[|{|\s) + # + # ^ line begins with + # \s* any (or no) spaces + # (\\)? matches a \ backslash but not necessarily + # (.*?) non-greedy character match and store the result + # (\[|}|=|(\s*\\)) either [ or { or = or space \ + + if ($_ =~ m/^\s*(\\)?(.*?)(\[|{|=|(\s*\\))/ + and (scalar($checkunmatched{$2}) + or scalar($checkunmatchedELSE{$2}) + or $alwaysLookforSplitBraces) + ) + { + # store the command name, because $2 + # will not exist after the next match + $commandname = $2; + $matchedbraces=0; + + # by default, don't look for an else construct + $lookforelse=0; + if(scalar($checkunmatchedELSE{$2})) + { + $lookforelse=1; + } + + # match { but don't match \{ + $matchedbraces++ while ($_ =~ /(?<!\\){/g); + + # match } but don't match \} + $matchedbraces-- while ($_ =~ /(?<!\\)}/g); + + # tracing mode + print $logfile "Line $lineCounter\t matchedbraces = $matchedbraces\n" if($tracingMode); + + # set the indentation + if($matchedbraces > 0 ) + { + # tracing mode + print $logfile "Line $lineCounter\t Found opening BRACE { $commandname\n" if($tracingMode); + + &increase_indent($commandname); + + # store the command name + # and the value of $matchedbraces + push(@commandstore,{commandname=>$commandname, + matchedbraces=>$matchedbraces, + lookforelse=>$lookforelse, + countzeros=>0}); + + } + elsif($matchedbraces<0) + { + # if $matchedbraces < 0 then we must be matching + # braces from a previous split-braces command + + # keep matching { OR }, and don't match \{ or \} + while ($_ =~ m/(((?<!\\){)|((?<!\\)}))/g) + { + + # store the match, either { or } + my $braceType = $1; + + # get the details of the most recent command name + $commanddetails = pop(@commandstore); + $commandname = $commanddetails->{'commandname'}; + $matchedbraces = $commanddetails->{'matchedbraces'}; + $countzeros = $commanddetails->{'countzeros'}; + $lookforelse= $commanddetails->{'lookforelse'}; + + $matchedbraces++ if($1 eq "{"); + $matchedbraces-- if($1 eq "}"); + + # if we've matched up the braces then + # we can decrease the indent by 1 level + if($matchedbraces == 0) + { + $countzeros++ if $lookforelse; + + # tracing mode + print $logfile "Line $lineCounter\t Found closing BRACE } $1\n" if($tracingMode); + + # decrease the indentation (if appropriate) + &decrease_indent($commandname); + + if($countzeros==1) + { + push(@commandstore,{commandname=>$commandname, + matchedbraces=>$matchedbraces, + lookforelse=>$lookforelse, + countzeros=>$countzeros}); + } + } + else + { + # otherwise we need to put the command back for the + # next brace count + push(@commandstore,{commandname=>$commandname, + matchedbraces=>$matchedbraces, + lookforelse=>$lookforelse, + countzeros=>$countzeros}); + } + } + } + } +} + +sub end_command_or_key_unmatched_braces{ + # PURPOSE: Check for the closing BRACE of a command that + # splits its BRACES across lines, such as + # + # \parbox{ ... + # + # or one of the tikz keys, such as + # + # empty header/.style={ + # + # It works by checking if we have any entries + # in the array @commandstore, and making + # sure that we're not starting another command/key + # that has split BRACES (nesting). + # + # It also checks that the line is not commented. + # + # We count the number of { and ADD to the counter + # } and SUBTRACT to the counter + if(scalar(@commandstore) + and !($_ =~ m/^\s*(\\)?(.*?)(\[|{|=|(\s*\\))/ + and (scalar($checkunmatched{$2}) + or scalar($checkunmatchedELSE{$2}) + or $alwaysLookforSplitBraces)) + and $_ !~ m/^\s*%/ + ) + { + # keep matching { OR }, and don't match \{ or \} + while ($_ =~ m/(((?<!\\){)|((?<!\\)}))/g) + { + # store the match, either { or } + my $braceType = $1; + + # get the details of the most recent command name + $commanddetails = pop(@commandstore); + $commandname = $commanddetails->{'commandname'}; + $matchedbraces = $commanddetails->{'matchedbraces'}; + $countzeros = $commanddetails->{'countzeros'}; + $lookforelse= $commanddetails->{'lookforelse'}; + + $matchedbraces++ if($1 eq "{"); + $matchedbraces-- if($1 eq "}"); + + # if we've matched up the braces then + # we can decrease the indent by 1 level + if($matchedbraces == 0) + { + $countzeros++ if $lookforelse; + + # tracing mode + print $logfile "Line $lineCounter\t Found closing BRACE } $commandname\n" if($tracingMode); + + # decrease the indentation (if appropriate) + &decrease_indent($commandname); + + if($countzeros==1) + { + push(@commandstore,{commandname=>$commandname, + matchedbraces=>$matchedbraces, + lookforelse=>$lookforelse, + countzeros=>$countzeros}); + } + } + else + { + # otherwise we need to enter the new value + # of $matchedbraces and the value of $command + # back into storage + push(@commandstore,{commandname=>$commandname, + matchedbraces=>$matchedbraces, + lookforelse=>$lookforelse, + countzeros=>$countzeros}); + + # tracing mode + print $logfile "Line $lineCounter\t Searching for closing BRACE } $commandname\n" if($tracingMode); + } + } + } +} + +sub check_for_else{ + # PURPOSE: Check for an else clause + # + # Some commands have the form + # + # \mycommand{ + # if this + # } + # { + # else this + # } + # + # so we need to look for the else bit, and set + # the indentation appropriately. + # + # We only perform this check if there's something + # in the array @commandstore, and if + # the line itself is not a command, or comment, + # and if it begins with { + + if(scalar(@commandstore) + and !($_ =~ m/^\s*(\\)?(.*?)(\[|{|=)/ + and (scalar($checkunmatched{$2}) + or scalar($checkunmatchedELSE{$2}) + or $alwaysLookforSplitBraces)) + and $_ =~ m/^\s*{/ + and $_ !~ m/^\s*%/ + ) + { + # get the details of the most recent command name + $commanddetails = pop(@commandstore); + $commandname = $commanddetails->{'commandname'}; + $matchedbraces = $commanddetails->{'matchedbraces'}; + $countzeros = $commanddetails->{'countzeros'}; + $lookforelse= $commanddetails->{'lookforelse'}; + + # increase indentation + if($lookforelse and $countzeros==1) + { + &increase_indent($commandname); + } + + # put the array back together + push(@commandstore,{commandname=>$commandname, + matchedbraces=>$matchedbraces, + lookforelse=>$lookforelse, + countzeros=>$countzeros}); + } +} + +sub at_beg_of_env_or_eq{ + # PURPOSE: Check if we're at the BEGINning of an environment + # or at the BEGINning of a displayed equation \[ + # + # This subroutine checks for matches of the form + # + # \begin{environmentname} + # or + # \[ + # + # It also checks to see if the current environment + # should have alignment delimiters; if so, we need to turn + # ON the $delimiter switch + + # How to read + # m/^\s*(\$)?\\begin{(.*?)}/ + # + # ^ beginning of a line + # \s* any white spaces (possibly none) + # (\$)? possibly a $ symbol, but not required + # \\begin{(.*)?} \begin{environmentname} + # + # How to read + # m/^\s*()(\\\[)/ + # + # ^ beginning of a line + # \s* any white spaces (possibly none) + # () empty just so that $1 and $2 are defined + # (\\\[) \[ there are lots of \ because both \ and [ need escaping + + if( ( ( $_ =~ m/^\s*(\$)?\\begin{(.*?)}/ and $_ !~ m/\\end{$2}/) + or ($_=~ m/^\s*()(\\\[)/ and $_ !~ m/\\\]/) ) + and $_ !~ m/^\s*%/ ) + { + # tracing mode + print $logfile "Line $lineCounter\t \\begin{environment} found: $2 \n" if($tracingMode); + + # increase the indentation + &increase_indent($2); + + # check for verbatim-like environments + if($verbatimEnvironments{$2}) + { + $inverbatim = 1; + # tracing mode + print $logfile "Line $lineCounter\t \\begin{verbatim-like} found, $2, switching ON verbatim \n" if($tracingMode); + + # remove the key and value from %lookForAlignDelims hash + # to avoid any further confusion + if($lookForAlignDelims{$2}) + { + print $logfile "WARNING\n\t Line $lineCounter\t $2 is in *both* lookForAlignDelims and verbatimEnvironments\n"; + print $logfile "\t\t\t ignoring lookForAlignDelims and prioritizing verbatimEnvironments\n"; + print $logfile "\t\t\t Note that you only get this message once per environment\n"; + delete $lookForAlignDelims{$2}; + } + + } + + # check to see if we need to look for alignment + # delimiters + if($lookForAlignDelims{$2}) + { + $delimiters=1; + # tracing mode + print $logfile "Line $lineCounter\t Delimiter environment started: $2 (see lookForAlignDelims)\n" if($tracingMode); + } + + # store the name of the environment + push(@environmentStack,$2); + + } +} + +sub at_end_of_env_or_eq{ + # PURPOSE: Check if we're at the END of an environment + # or at the END of a displayed equation \] + # + # This subroutine checks for matches of the form + # + # \end{environmentname} + # or + # \] + # + # It also checks to see if the current environment + # had alignment delimiters; if so, we need to turn + # OFF the $delimiter switch + + if( ($_ =~ m/^\s*\\end{(.*?)}/ or $_=~ m/^(\\\])/) + and $_ !~ m/\s*^%/) + { + + # check if we're at the end of a verbatim-like environment + if($verbatimEnvironments{$1}) + { + $inverbatim = 0; + # tracing mode + + print $logfile "Line $lineCounter\t \\end{verbatim-like} found: $1, switching off verbatim \n" if($tracingMode); + print $logfile "Line $lineCounter\t removing leading spaces \n" if($tracingMode); + #s/^\ *//; + s/^\t+// if($_ ne ""); + s/^\s+// if($_ ne ""); + } + + # check to see if \end{environment} fits with most recent \begin{...} + my $previousEnvironment = pop(@environmentStack); + + # check to see if we need to turn off alignment + # delimiters and output the current block + if($lookForAlignDelims{$1} and ($previousEnvironment eq $1)) + { + $delimiters=0; + + # tracing mode + print $logfile "Line $lineCounter\t Delimiter body FINISHED: $1\n" if($tracingMode); + + # print the current FORMATTED block + @block = &format_block(@block); + foreach $line (@block) + { + # add the indentation and add the + # each line of the formatted block + # to the output + # unless this would only create trailing whitespace and the + # corresponding option is set + unless ($line =~ m/^$/ and $removeTrailingWhitespace) + { + $line = join("",@indent).$line; + } + push(@lines,$line); + } + # empty the @block, very important! + @block=(); + } + + # tracing mode + print $logfile "Line $lineCounter\t \\end{envrionment} found: $1 \n" if($tracingMode and !$verbatimEnvironments{$1}); + + # check to see if \end{environment} fits with most recent \begin{...} + if($previousEnvironment eq $1) + { + # decrease the indentation (if appropriate) + &decrease_indent($1); + } + else + { + # otherwise put the environment name back on the stack + push(@environmentStack,$previousEnvironment); + print $logfile "Line $lineCounter\t WARNING: \\end{$1} found on its own line, not matched to \\begin{$previousEnvironment}\n" unless ($delimiters or $inverbatim or $inIndentBlock or $1 eq "\\\]"); + } + + # need a special check for \[ and \] + if($1 eq "\\\]") + { + &decrease_indent($1); + pop(@environmentStack); + } + + # if we're at the end of the document, we remove all current + # indentation- this is especially prominent in examples that + # have headings, and the user has chosen to indentAfterHeadings + if($1 eq "document" and !(grep(/filecontents/, @indentNames)) and !$inpreamble and !$delimiters and !$inverbatim and !$inIndentBlock) + { + @indent=(); + @indentNames=(); + print $logfile "Line $lineCounter\t \\end{$1} found- emptying indent array \n" unless ($delimiters or $inverbatim or $inIndentBlock or $1 eq "\\\]"); + } + } +} + +sub format_block{ + # PURPOSE: Format a delimited environment such as the + # tabular or align environment that contains & + # + # INPUT: @block array containing unformatted block + # from, for example, align, or tabular + # OUTPUT: @formattedblock array containing FORMATTED block + + + # @block is the input + my @block=@_; + + # tracing mode + print $logfile "\t\tFormatting alignment block\n" if($tracingMode); + + # step the line counter back to the beginning of the block- + # it will be increased back to the end of the block in the + # loop later on: foreach $row (@tmpblock) + $lineCounter -= scalar(@block); + + + # local array variables + my @formattedblock; + my @tmprow=(); + my @tmpblock=(); + my @maxmstringsize=(); + my @ampersandCount=(); + + # local scalar variables + my $alignrowcounter=-1; + my $aligncolcounter=-1; + my $tmpstring; + my $row; + my $column; + my $maxmcolstrlength; + my $i; + my $j; + my $fmtstring; + my $linebreak; + my $maxNumberAmpersands = 0; + my $currentNumberAmpersands; + my $trailingcomments; + + # local hash table + my %stringsize=(); + + # loop through the block and count & per line- store the biggest + # NOTE: this needs to be done in its own block so that + # we can know what the maximum number of & in the block is + foreach $row (@block) + { + # delete trailing comments + $trailingcomments=''; + if($row =~ m/((?<!\\)%.*$)/) + { + $row =~ s/((?<!\\)%.*)/%TC/; + $trailingcomments=$1; + } + + # reset temporary counter + $currentNumberAmpersands=0; + + # count & in current row (exclude \&) + $currentNumberAmpersands++ while ($row =~ /(?<!\\)&/g); + + # store the ampersand count for future + push(@ampersandCount,$currentNumberAmpersands); + + # overwrite maximum count if the temp count is higher + $maxNumberAmpersands = $currentNumberAmpersands if($currentNumberAmpersands > $maxNumberAmpersands ); + + # put trailing comments back on + if($trailingcomments) + { + $row =~ s/%TC/$trailingcomments/; + } + } + + # tracing mode + print $logfile "\t\tmaximum number of & in any row: $maxNumberAmpersands\n" if($tracingMode); + + # loop through the lines in the @block + foreach $row (@block) + { + # get the ampersand count + $currentNumberAmpersands = shift(@ampersandCount); + + # increment row counter + $alignrowcounter++; + + # clear the $linebreak variable + $linebreak=''; + + # check for line break \\ + # and don't mess with a line that doesn't have the maximum + # number of & + if($row =~ m/\\\\/ and $currentNumberAmpersands==$maxNumberAmpersands ) + { + # remove \\ and all characters that follow + # and put it back in later, once the measurement + # has been done + $row =~ s/(\\\\.*)//; + $linebreak = $1; + } + + if($currentNumberAmpersands==$maxNumberAmpersands) + { + + # remove trailing comments + $trailingcomments=''; + if($row =~ m/((?<!\\)%.*$)/) + { + $row =~ s/((?<!\\)%.*)/%TC/; + $trailingcomments=$1; + } + + # separate the row at each &, but not at \& + @tmprow = split(/(?<!\\)&/,$row); + + # reset column counter + $aligncolcounter=-1; + + # loop through each column element + # removing leading and trailing space + foreach $column (@tmprow) + { + # increment column counter + $aligncolcounter++; + + # remove leading and trailing space from element + $column =~ s/^\s+//; + $column =~ s/\s+$//; + + # assign string size to the array + $stringsize{$alignrowcounter.$aligncolcounter}=length($column); + if(length($column)==0) + { + $column=" "; + } + + # put the row back together + if ($aligncolcounter ==0) + { + $tmpstring = $column; + } + else + { + $tmpstring .= "&".$column; + } + } + + + # put $linebreak back on the string, now that + # the measurement has been done + $tmpstring .= $linebreak; + + # put trailing comments back on + if($trailingcomments) + { + $tmpstring =~ s/%TC/$trailingcomments/; + } + + push(@tmpblock,$tmpstring); + } + else + { + # if there are no & then use the + # NOFORMATTING token + # remove leading space + s/^\s+//; + push(@tmpblock,$row."NOFORMATTING"); + } + } + + # calculate the maximum string size of each column + for($j=0;$j<=$aligncolcounter;$j++) + { + $maxmcolstrlength=0; + for($i=0; $i<=$alignrowcounter;$i++) + { + # make sure the stringsize is defined + if(defined $stringsize{$i.$j}) + { + if ($stringsize{$i.$j}>$maxmcolstrlength) + { + $maxmcolstrlength = $stringsize{$i.$j}; + } + } + } + push(@maxmstringsize,$maxmcolstrlength); + } + + # README: printf( formatting, expression) + # + # formatting has the form %-50s & %-20s & %-19s + # (the numbers have been made up for example) + # the - symbols mean that each column should be left-aligned + # the numbers represent how wide each column is + # the s represents string + # the & needs to be inserted + + # join up the maximum string lengths using "s %-" + $fmtstring = join("s & %-",@maxmstringsize); + + # add an s to the end, and a newline + $fmtstring .= "s "; + + # add %- to the beginning + $fmtstring = "%-".$fmtstring; + + # process the @tmpblock of aligned material + foreach $row (@tmpblock) + { + + $linebreak=''; + # check for line break \\ + if($row =~ m/\\\\/) + { + # remove \\ and all characters that follow + # and put it back in later + $row =~ s/(\\\\.*$)//; + $linebreak = $1; + } + + if($row =~ m/NOFORMATTING/) + { + $row =~ s/NOFORMATTING//; + $tmpstring=$row; + + # tracing mode + print $logfile "\t\tLine $lineCounter\t maximum number of & NOT found- not aligning delimiters \n" if($tracingMode); + } + else + { + # remove trailing comments + $trailingcomments=''; + if($row =~ m/((?<!\\)%.*$)/) + { + $row =~ s/((?<!\\)%.*)/%TC/; + $trailingcomments=$1; + } + + $tmpstring = sprintf($fmtstring,split(/(?<!\\)&/,$row)).$linebreak."\n"; + + # put trailing comments back on + if($trailingcomments) + { + $tmpstring =~ s/%TC/$trailingcomments/; + } + + # tracing mode + print $logfile "\t\tLine $lineCounter\t Found maximum number of & so aligning delimiters\n" if($tracingMode); + } + + # remove trailing whitespace + if ($removeTrailingWhitespace) + { + print $logfile "Line $lineCounter\t removing trailing whitespace from delimiter aligned line\n" if ($tracingMode); + $tmpstring =~ s/\s+$/\n/; + } + + push(@formattedblock,$tmpstring); + + # increase the line counter + $lineCounter++; + } + + # return the formatted block + @formattedblock; +} + +sub increase_indent{ + # PURPOSE: Adjust the indentation + # of the current environment; + # check that it's not an environment + # that doesn't want indentation. + + my $command = pop(@_); + + # if the user has specified $indentRules{$command} and + # $noAdditionalIndent{$command} then they are a bit confused- + # we remove the $indentRules{$command} and assume that they + # want $noAdditionalIndent{$command} + if(scalar($indentRules{$command}) and $noAdditionalIndent{$command}) + { + print $logfile "WARNING\n\t Line $lineCounter\t $command is in *both* indentRules and noAdditionalIndent\n"; + print $logfile "\t\t\t ignoring indentRules and prioritizing noAdditionalIndent\n"; + print $logfile "\t\t\t Note that you only get this message once per command/environment\n"; + + # remove the key and value from %indentRules hash + # to avoid any further confusion + delete $indentRules{$command}; + } + + # if the command is in verbatimEnvironments and in indentRules then + # remove it from %indentRules hash + # to avoid any further confusion + if($indentRules{$command} and $verbatimEnvironments{$command}) + { + # remove the key and value from %indentRules hash + # to avoid any further confusion + print $logfile "WARNING\n\t Line $lineCounter\t $command is in *both* indentRules and verbatimEnvironments\n"; + print $logfile "\t\t\t ignoring indentRules and prioritizing verbatimEnvironments\n"; + print $logfile "\t\t\t Note that you only get this message once per environment\n"; + delete $indentRules{$command}; + } + + if(scalar($indentRules{$command})) + { + # if there's a rule for indentation for this environment + push(@indent, $indentRules{$command}); + # tracing mode + print $logfile "Line $lineCounter\t increasing indent using rule for $command (see indentRules)\n" if($tracingMode); + push(@indentNames,"$command (rule)"); + } + else + { + # default indentation + if(!($noAdditionalIndent{$command} or $verbatimEnvironments{$command} or $inverbatim)) + { + push(@indent, $defaultIndent); + push(@indentNames,"$command (default)"); + # tracing mode + print $logfile "Line $lineCounter\t increasing indent using defaultIndent\n" if($tracingMode); + } + elsif($noAdditionalIndent{$command}) + { + # tracing mode + print $logfile "Line $lineCounter\t no additional indent added for $command (see noAdditionalIndent)\n" if($tracingMode); + } + } +} + +sub decrease_indent{ + # PURPOSE: Adjust the indentation + # of the current environment; + # check that it's not an environment + # that doesn't want indentation. + + my $command = pop(@_); + + if(!($noAdditionalIndent{$command} or $verbatimEnvironments{$command} or $inverbatim)) + { + pop(@indent); + pop(@indentNames); + # tracing mode + print $logfile "Line $lineCounter\t decreasing indent to: ",join(", ",@indentNames),"\n" if($tracingMode); + } +} + diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index 383130c7532..98c5d7a6842 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -264,7 +264,8 @@ my @TLP_working = qw( latex2e-help-texinfo latex2e-help-texinfo-spanish latex2man latex4wp latex4wp-it latexcheat latexcheat-esmx latexcheat-ptbr - latexdiff latexfileinfo-pkgs latexfileversion latexmk latexmp latexpand + latexdiff latexfileinfo-pkgs latexfileversion latexindent + latexmk latexmp latexpand lato layaureo layouts lazylist lcd lcg lcyw leading leaflet lecturer ledmac leftidx leipzig lengthconvert lettre lettrine levy lewis lexikon lfb lgreek lh lhcyr lhelp diff --git a/Master/tlpkg/libexec/ctan2tds b/Master/tlpkg/libexec/ctan2tds index 6210ee8dc87..e43b2f9895b 100755 --- a/Master/tlpkg/libexec/ctan2tds +++ b/Master/tlpkg/libexec/ctan2tds @@ -549,7 +549,6 @@ chomp ($Build = `cd $Master/../Build/source && pwd`); 'latex2rtf', "die 'skipping, no configure or requests, etc.'", 'latex3', "die 'skipping, use xpackages'", 'latexdb', "die 'skipping, needs sql, etc.'", - 'latexindent', "die 'skipping, requires data file in bindir'", 'latexmp', "&MAKEflatten", 'layaureo', "&MAKEflatten", 'lato', "&MAKEcopy", @@ -2396,6 +2395,7 @@ $standardxmt='\.xmt'; # scripts to install under texmf*/.../scripts, but not bindir. %specialscripts_nobin = ( 'epspdf' => '(epspdf(|\.help|boot|tk)|\.rb|makegray\.pro)$', + 'latexindent' => 'Settings\.yaml$', 'lilyglyphs' => 'lilyglyphs_common.py', 'lua-alt-getopt' => '\.lua$', 'lua2dox' => '\.(lua|def)$', @@ -2436,6 +2436,7 @@ $standardxmt='\.xmt'; 'latex-git-log' => 'latex-git-log$', 'latex2man' => 'latex2man$', 'latexdiff' => 'latex(diff|diff-vc|revise)\.pl$', + 'latexindent' => 'latexindent\.pl$', 'latexmk' => '\.pl$', 'latexfileversion' => 'latexfileversion$', 'latexpand' => 'latexpand$', @@ -2547,6 +2548,7 @@ $standardclean = '\.head|\.tmp|\.dvi|\.log|\.out|\.aux|\.toc|\.lof|\.lot' 'ibycus-babel' => $standardclean . '|ibyhyph.tex', # in hyphen-ancientgreek 'jadetex' => $standardclean # these sty files are in passivetex . '|(dummyels|mlnames|ucharacters|unicode)\.sty', + 'latexindent' => 'latexindent.exe', # have our own stub 'lshort-russian'=>'lshortbk.zip', # sources are enough 'lshort-spanish'=>'lshort-letter.pdf', # a4 is enough 'mathexam' => 'sample.tex~', diff --git a/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc b/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc index 3bf5f8cfc20..f14dad6385d 100644 --- a/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc @@ -41,6 +41,7 @@ depend latexdiff depend latexfileversion depend latexmk depend latexpand +depend latexindent depend ltxfileinfo depend listings-ext depend match_parens diff --git a/Master/tlpkg/tlpsrc/latexindent.tlpsrc b/Master/tlpkg/tlpsrc/latexindent.tlpsrc new file mode 100644 index 00000000000..dca338c719c --- /dev/null +++ b/Master/tlpkg/tlpsrc/latexindent.tlpsrc @@ -0,0 +1 @@ +binpattern f bin/${ARCH}/${PKGNAME} |