Please create a colorful handbook pdf from file attached where you must create pdf with following information as follows... please write all individual answers for all individual exercises in file attached, secondly explain the grammar topic " participle clauses" in a very creative and easy way also pick up information given in attached file and write many examples to understand later explain " relative clauses" topic in also easy and creative way and then later compare both topics like " participle clauses vs relative clauses '. Thirdly write list of vocabulary words list from file attached and used which are of proficiency B2 And above with it's meaning in English and later in Russian language under it and also add 3 daily life examples of sentences.Fourthly at last prepare 15 conversation questions for intensive speaking practice from the file attached along with it answers. Conversation questions must be logical and creative for ESL 8th grade student B2+

Reading File
Browsing Directory

~/

Searching the Web

British Council participle clauses relative clauses grammar explanation

Browsing Directory

~/attachments/84b8dfae-d980-4cbb-b913-6ab65df1403b

Reading File
Running Command

python -c "import pdfplumber; p='/tmp/workspace/attachments/84b8dfae-d980-4cbb-b913-6ab65df1403b/DOC-20261018-WA0000.pdf'; pdf=pdfplumber.open(p); print('PAGES',len(pdf.pages)); [print('---PAGE',i+1,'---\n'+(page.extract_text() or '')[:12000]) for i,page in enumerate(pdf.pages)]"

Running Command

mkdir -p "/tmp/workspace/animal-headlines-handbook/src" "/tmp/workspace/animal-headlines-handbook/output" && cat > "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" <<'PY' from reportlab.lib import colors from reportlab.lib.colors import HexColor from reportlab.lib.enums import TA_CENTER, TA_LEFT from reportlab.lib.pagesizes import A4 from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import cm from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak, Table, TableStyle, KeepTogether from reportlab.pdfbase.pdfmetrics import stringWidth from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfbase import pdfmetrics from reportlab.lib import utils OUT='/tmp/workspace/animal-headlines-handbook/output/Animal_Headlines_B2_Handbook.pdf' NAVY=HexColor('#183153'); TEAL=HexColor('#0B8B8C'); MINT=HexColor('#DDF5F0'); CORAL=HexColor('#F26B5B'); SUN=HexColor('#F8C84E'); LILAC=HexColor('#EDE4FA'); SKY=HexColor('#DCEEFF'); INK=HexColor('#23313F'); GREY=HexColor('#61717D') def P(text, style='body'): return Paragraph(text, styles[style]) def bullet(text): return P('• '+text, 'body') def box(title, text, color=SKY): t=Table([[P(title,'box_title')],[P(text,'body')]], colWidths=[17.1*cm]) t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,0),color),('BACKGROUND',(0,1),(-1,-1),colors.white),('BOX',(0,0),(-1,-1),0.8,color),('LINEBELOW',(0,0),(-1,0),0.8,color),('LEFTPADDING',(0,0),(-1,-1),10),('RIGHTPADDING',(0,0),(-1,-1),10),('TOPPADDING',(0,0),(-1,-1),7),('BOTTOMPADDING',(0,0),(-1,-1),7)])) return t def table(rows, widths, header=True): data=[] for ri,row in enumerate(rows): data.append([P(str(x), 'tablehead' if ri==0 and header else 'cell') for x in row]) t=Table(data,colWidths=widths,repeatRows=1 if header else 0,hAlign='LEFT') ts=[('VALIGN',(0,0),(-1,-1),'TOP'),('GRID',(0,0),(-1,-1),0.35,HexColor('#B8CBD9')),('LEFTPADDING',(0,0),(-1,-1),6),('RIGHTPADDING',(0,0),(-1,-1),6),('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5)] if header: ts += [('BACKGROUND',(0,0),(-1,0),NAVY),('TEXTCOLOR',(0,0),(-1,0),colors.white)] for i in range(1 if header else 0,len(rows)): if i%2: ts.append(('BACKGROUND',(0,i),(-1,i),HexColor('#F7FBFD'))) t.setStyle(TableStyle(ts)); return t styles=getSampleStyleSheet() styles.add(ParagraphStyle(name='title', parent=styles['Title'], fontName='Helvetica-Bold', fontSize=27, leading=31, alignment=TA_CENTER, textColor=NAVY, spaceAfter=10)) styles.add(ParagraphStyle(name='subtitle', parent=styles['Normal'], fontName='Helvetica', fontSize=13, leading=17, alignment=TA_CENTER, textColor=TEAL, spaceAfter=12)) styles.add(ParagraphStyle(name='h1x', parent=styles['Heading1'], fontName='Helvetica-Bold', fontSize=19, leading=24, textColor=NAVY, spaceBefore=8, spaceAfter=8)) styles.add(ParagraphStyle(name='h2x', parent=styles['Heading2'], fontName='Helvetica-Bold', fontSize=13.5, leading=17, textColor=TEAL, spaceBefore=8, spaceAfter=6)) styles.add(ParagraphStyle(name='body', parent=styles['BodyText'], fontName='Helvetica', fontSize=9.3, leading=13, textColor=INK, spaceAfter=5)) styles.add(ParagraphStyle(name='small', parent=styles['BodyText'], fontName='Helvetica', fontSize=8, leading=10.3, textColor=GREY, spaceAfter=3)) styles.add(ParagraphStyle(name='box_title', parent=styles['BodyText'], fontName='Helvetica-Bold', fontSize=10.2, leading=12, textColor=NAVY, spaceAfter=0)) styles.add(ParagraphStyle(name='tablehead', parent=styles['BodyText'], fontName='Helvetica-Bold', fontSize=8.2, leading=10, textColor=colors.white, spaceAfter=0)) styles.add(ParagraphStyle(name='cell', parent=styles['BodyText'], fontName='Helvetica', fontSize=8.05, leading=10.1, textColor=INK, spaceAfter=0)) def footer(canvas, doc): canvas.saveState(); w,h=A4 canvas.setStrokeColor(TEAL); canvas.setLineWidth(1); canvas.line(1.7*cm,1.35*cm,w-1.7*cm,1.35*cm) canvas.setFont('Helvetica',8); canvas.setFillColor(GREY); canvas.drawString(1.7*cm,0.9*cm,'Animal Headlines | B2+ Grammar & Speaking Handbook') canvas.drawRightString(w-1.7*cm,0.9*cm,f'{doc.page}') canvas.restoreState() story=[] # Cover story += [Spacer(1,2.2*cm), P('ANIMAL HEADLINES','title'), P('A colorful B2+ English handbook for Grade 8', 'subtitle'), Spacer(1,0.45*cm)] cover=Table([[P('<b>NEWS • NATURE • LANGUAGE</b><br/><br/>Discover the language of animal news. Learn how to shorten sentences with participle clauses, describe with relative clauses, build high-level vocabulary, and speak with confidence.','body')]],colWidths=[15.8*cm]) cover.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),MINT),('BOX',(0,0),(-1,-1),1.2,TEAL),('LEFTPADDING',(0,0),(-1,-1),22),('RIGHTPADDING',(0,0),(-1,-1),22),('TOPPADDING',(0,0),(-1,-1),18),('BOTTOMPADDING',(0,0),(-1,-1),18)])) story += [cover, Spacer(1,1.1*cm), box('WHAT IS INSIDE','1. Complete answer key to the attached pages<br/>2. Creative grammar: participle clauses<br/>3. Relative clauses and a clear comparison<br/>4. B2+ vocabulary with Russian translations and daily-life examples<br/>5. Fifteen intensive speaking questions with model answers',SUN), Spacer(1,1.2*cm), P('Based on the attached Unit 7B pages: “Animals making headlines”.', 'subtitle'), PageBreak()] # answer key story += [P('1. Answer Key: Animals Making Headlines','h1x'), box('A NOTE ABOUT THE SOURCE','The attachment includes the task page and two reading articles: <i>Abandoned cat ensures business’s success</i> and <i>Splendid Frog sounds alarm</i>. Exercises 3-6 also refer to pages 194 and File 7, which are not included. For those tasks, this handbook gives full model responses based on the available material and clearly labels them as models.',LILAC)] story += [P('Exercise 1: Rank the animals','h2x'),P('This is a discussion activity, so there is no single correct order. Here is one logical model ranking. 1 = least; 8 = most.', 'body')] story.append(table([['Animal','Most endangered','Most useful','Most dangerous','Best pet'],['bull','2','5','6','1'],['cat','3','7','3','8'],['dog','2','8','5','7'],['frog','7','4','2','3'],['rat','5','6','4','2'],['snake','6','3','7','4'],['tiger','8','2','8','5'],['whale','7','1','1','6']], [2.3*cm,3.7*cm,3.7*cm,3.7*cm,3.7*cm])) story += [P('Model explanation: Tigers are very endangered because habitat loss and illegal trade threaten them. Dogs are the most useful because they can guide, rescue, protect, and support people. Whales are dangerous least often because humans rarely meet them. Cats make excellent pets for people who live in small homes.', 'small')] story += [P('Exercise 2: Headlines and phrases','h2x'),table([['Headline','Useful words','Model prediction'],['1. Splendid Frog sounds alarm','target for smugglers; be stopped, if not reversed','A rare frog may have become extinct because people destroyed its habitat and smugglers captured it. The crisis might still be slowed or reversed for other species.'],['2. Abandoned cat ensures business’s success','at the point of going bankrupt; set up a shelter','A struggling business may have been saved after an abandoned cat attracted visitors. The owner may later have created a shelter.'],['3. Victory in bullfighting fight','voted to lift a ban; subsidies are being reviewed','A government or local authority may have allowed bullfighting again, while financial support for it is being reconsidered.'],['4. Controversial research lab finally opens','investigate conditions; intimidate people','A laboratory may have opened despite opposition. It may investigate scientific or medical conditions, while activists may have tried to frighten people connected with it.']], [4*cm,5.3*cm,8*cm])] story += [P('Exercises 3-6: Reading, discussion and retelling','h2x'),box('MODEL ANSWERS FOR THE TWO AVAILABLE ARTICLES','<b>Abandoned cat:</b> An ill kitten came to Naoki Teraoka’s restaurant when the business was close to bankruptcy. He sheltered the kitten and its family, photographed them near his railway models, and posted the images online. Visitors came to see the cats, so the cafe became successful. He later created a shelter that has rescued more than 100 cats.<br/><br/><b>Splendid Poison Frog:</b> The frog was declared extinct. Disease, deforestation for timber and farmland, and smuggling contributed to its disappearance. Scientists warn that human activity could cause a sixth mass extinction. Laws, disease research, and legal breeding projects may help other species, but they came too late for this frog.',MINT),P('<b>Information I would leave out in a short retelling:</b> the Godzilla comparison, the exact city (Osaka), and small details about model railways. For the frog story, I would omit the collector price comparison. These details are interesting but not essential to the main message.', 'body'),P('<b>Exercise 5 model oral retelling:</b> “I read about a restaurant owner in Japan whose business was failing during the pandemic. An abandoned kitten arrived, and the owner cared for it. Photos of cats among miniature trains became popular online. The restaurant now attracts visitors and helps rescue cats.”', 'body')] story += [P('Exercise 7: Word families','h2x'),table([['No.','Completed pair','Word family / meaning'],['1','save it from <b>bankruptcy</b> / at the point of going <b>bankrupt</b>','bankrupt'],['2','be <b>ongoing</b> / a <b>research</b> lab','go on / research'],['3','a sixth great <b>extinction</b> / be declared <b>extinct</b>','extinct'],['4','see it as a <b>threat</b> / send <b>threatening</b> letters','threaten'],['5','opponents <b>highlight</b> / claim that vivisection is <b>unethical</b>','ethics'],['6','humanity’s own <b>survival</b> / the result of human <b>activity</b>','survive / active'],['7','are being <b>reviewed</b> / local <b>government</b>','review / govern'],['8','get an instant <b>response</b> / with <b>demonstrations</b>','respond / demonstrate'],['9','their <b>popularity</b> is increasing / a <b>popular</b> art form','popular']], [0.8*cm,8.4*cm,8.1*cm])) story += [P('Exercise 8: Participle clauses','h2x'),P('<b>1.</b> <i>involved</i> is passive: people are involved in the project. <i>attending</i> is active: people attend bullfights.', 'body'),P('<b>2a.</b> Activists tried to intimidate people <b>who were involved in the project.</b><br/><b>2b.</b> The numbers of people <b>who attend bullfights</b> are in decline.', 'body')] story += [P('Exercise 9: Choose the correct option','h2x'),table([['No.','Correct phrase'],['1','the number of pets <b>abandoned</b> by their owners'],['2','the number of species <b>dying out</b>'],['3','the number of people <b>becoming</b> vegan'],['4','the number of people <b>cured</b> of cancer'],['5','the amount of money <b>made</b> by supermarkets last year'],['6','the amount of forest <b>destroyed</b> each year'],['7','the amount of pet food <b>sold</b> last year'],['8','the amount of support <b>given</b> to oil companies']], [1.5*cm,15.8*cm])] story += [P('Exercise 10: Discussing trends','h2x'),box('MODEL RESPONSE','In my country, the number of pets abandoned by their owners may be rising because vet care and food are expensive. That is negative because animals need stable homes. The number of people becoming vegan seems to be increasing because people are concerned about health, animals, and the environment. The amount of forest destroyed should go down: forests protect biodiversity and the climate.','body' if False else SKY)] # fix calling box mistake accepted? arguments title/text/color, above passes third style erroneously string? Third is SKY okay title model response text then SKY; yes story += [P('Exercise 11: News / personal experience','h2x'),P('<b>Model story:</b> “Last year, a small dog was found near my school during winter. Students shared its photo online, and a local rescue group responded quickly. The dog was checked by a vet and reunited with its owner two days later. The story showed me that social media can be useful when people act responsibly.”', 'body'),PageBreak()] # participle story += [P('2. Participle Clauses: The Sentence Backpack','h1x'),P('A participle clause is a compact “backpack” of extra information. Instead of carrying a long relative clause, we use an <b>-ing</b>, <b>-ed</b>, or <b>having + past participle</b> form.', 'body'),box('THE BIG RULE','The hidden subject in the participle clause must be the same as the subject in the main clause.<br/><br/><b>Correct:</b> <i>Walking through the forest, Maya saw a rare bird.</i> (Maya was walking.)<br/><b>Wrong:</b> <i>Walking through the forest, a rare bird was seen.</i> (It sounds as if the bird was walking.)',CORAL)] story += [P('Three useful forms','h2x'),table([['Form','Use','Animal-news example','Full version'],['present participle: <b>-ing</b>','active action or situation','People <b>attending</b> bullfights are decreasing in number.','People <b>who attend</b> bullfights...'],['past participle: <b>-ed / irregular</b>','passive meaning','Cats <b>abandoned</b> by owners need care.','Cats <b>that are abandoned</b> by owners...'],['perfect participle: <b>having + past participle</b>','an earlier completed action','<b>Having rescued</b> the kittens, Teraoka photographed them.','After he had rescued the kittens, Teraoka...']], [3.6*cm,3.1*cm,5.1*cm,5.3*cm])) story += [P('How to make one','h2x'),table([['Step','Example'],['1. Find the extra clause','The frogs <b>that live in cloud forests</b> are threatened.'],['2. Is it active? Use -ing','The frogs <b>living in cloud forests</b> are threatened.'],['3. Is it passive? Use past participle','The forests <b>destroyed by logging</b> are hard to restore.'],['4. Is it an earlier action? Use having + past participle','<b>Having read</b> the article, we discussed extinction.']], [3.3*cm,13.8*cm])) story += [P('Creative examples from the text','h2x'),table([['Long form','Short, natural form'],['A cafe <b>which was set up</b> by an animal lover became popular.','A cafe <b>set up</b> by an animal lover became popular.'],['Researchers <b>who are investigating</b> diseases need funding.','Researchers <b>investigating</b> diseases need funding.'],['The cats <b>that were photographed</b> with miniature trains became famous.','The cats <b>photographed</b> with miniature trains became famous.'],['After he had posted the photos, he received visitors.','<b>Having posted</b> the photos, he received visitors.'],['Because the frog was threatened by smugglers, it needed protection.','<b>Threatened</b> by smugglers, the frog needed protection.']], [8.4*cm,8.7*cm])) story += [P('Punctuation and caution','h2x'),bullet('Use a comma when the participle clause comes first: <i>Concerned about the animals, the students started a campaign.</i>'),bullet('After a noun, commas are usually not needed: <i>The students campaigning for animal rights spoke at school.</i>'),bullet('Do not reduce every relative clause. Keep the full clause when it is clearer or when subjects are different.'),box('QUICK CHECK','Ask: “Who is doing or receiving this action?” If the answer is not the main-clause subject or noun, choose a full relative clause instead.',SUN),PageBreak()] # relative story += [P('3. Relative Clauses: The Noun Detective','h1x'),P('A relative clause gives extra information about a noun. It begins with a “detective word” such as <b>who, which, that, whose, where</b>. It answers: <i>Which person? Which thing? Whose? Where?</i>', 'body')] story += [P('The detective words','h2x'),table([['Word','Use','Example'],['<b>who</b>','people','The owner <b>who rescued the kittens</b> runs a cafe.'],['<b>which</b>','things / animals, especially extra information','The frog, <b>which had brightly coloured skin</b>, attracted collectors.'],['<b>that</b>','people or things in defining clauses','The shelter <b>that saved the cats</b> needs volunteers.'],['<b>whose</b>','possession','The student <b>whose dog was rescued</b> thanked the vet.'],['<b>where</b>','places','Osaka is the city <b>where the cafe is located</b>.']], [2.5*cm,4.3*cm,10.3*cm])) story += [P('Two types: choose the meaning','h2x'),table([['Type','Meaning','Example'],['<b>Defining</b> (no commas)','The information identifies exactly which person or thing.','The cats <b>that live in the cafe</b> attract visitors. (Not all cats.)'],['<b>Non-defining</b> (commas)','The information is extra. The noun is already clear. Do not use <i>that</i>.','The cafe cats, <b>which live safely indoors</b>, attract visitors.']], [4.2*cm,5.1*cm,7.8*cm])) story += [P('Can we leave out the relative word?','h2x'),box('YES, BUT ONLY SOMETIMES','You can omit <i>who / which / that</i> when it is the <b>object</b>: <i>The article (that) we read was sad.</i><br/>You cannot omit it when it is the <b>subject</b>: <i>The article that explained extinction was clear.</i>','body' if False else MINT)] story += [P('Relative clauses vs participle clauses','h2x'),table([['Feature','Relative clause','Participle clause'],['Shape','who / which / that + verb','-ing, past participle, or having + past participle'],['Style','full and clear','shorter, more formal or written'],['Active meaning','People <b>who attend</b> bullfights','People <b>attending</b> bullfights'],['Passive meaning','Animals <b>that are abandoned</b>','Animals <b>abandoned</b>'],['Earlier action','After she had read the story...','<b>Having read</b> the story...'],['Best use','When clarity or a complete thought matters','When the same subject is clear and the reduction sounds natural']], [3*cm,7*cm,7.1*cm])) story += [P('The bridge between them: reduced relative clauses','h2x'),P('Many participle clauses in this unit are actually <b>reduced relative clauses</b>. Start with a relative clause, then remove the relative pronoun and the form of <i>be</i> where possible.', 'body'),table([['Full relative clause','Reduced clause'],['the research lab <b>which is funded</b> by Oxford University','the research lab <b>funded</b> by Oxford University'],['conditions <b>which are affecting</b> endangered species','conditions <b>affecting</b> endangered species'],['people <b>who are involved</b> in the project','people <b>involved</b> in the project']], [8.5*cm,8.6*cm])) story += [P('Mini challenge: choose the best form','h2x'),table([['Sentence','Answer'],['1. The animals ______ by the shelter need homes. (that were rescued / rescued)','<b>rescued</b>'],['2. The volunteer ______ the posters is my friend. (who designed / designing)','Both are possible. <b>designing</b> is shorter.'],['3. ______ the report, the class planned a fundraiser. (After they had read / Having read)','Both are possible. <b>Having read</b> is more compact.'],['4. The school, ______ holds a wildlife fair, raised money. (that / which)','<b>which</b>, because it is non-defining and has commas.']], [10*cm,7.1*cm])),PageBreak()] # vocab story += [P('4. B2+ Vocabulary Bank','h1x'),P('The words below are drawn from, or directly built from, the attached pages. Each entry has a clear English meaning, Russian translation, and three realistic examples.', 'body')] vocab=[ ('abandoned','left by an owner or caregiver; no longer cared for','брошенный','We found an abandoned bicycle near the station.','The shelter cares for abandoned cats.','Never leave an abandoned bag in a public place.'), ('bankruptcy','a situation in which a person or business cannot pay what it owes','банкротство','The small shop avoided bankruptcy after an online campaign.','High costs pushed the company towards bankruptcy.','The owner spoke honestly about the risk of bankruptcy.'), ('ongoing','continuing and not finished','продолжающийся, текущий','Our ongoing project is to reduce plastic waste.','The teacher gave feedback during the ongoing experiment.','There is an ongoing discussion about school uniforms.'), ('extinct / extinction','no longer existing as a species / the process of dying out','вымерший / вымирание','Dinosaurs are extinct, but many species are at risk today.','Habitat loss can lead to extinction.','The museum has an exhibition about extinct animals.'), ('habitat','the natural home of a plant or animal','среда обитания','A pond is an important habitat for frogs.','Road building can damage an animal’s habitat.','We made a bird habitat in the school garden.'), ('smuggler','a person who secretly moves illegal goods or animals across borders','контрабандист','Police stopped a smuggler at the airport.','Wildlife smugglers harm rare species.','The film was about a smuggler of stolen art.'), ('subsidy','money given by a government to support an activity or business','субсидия, государственная поддержка','The farm received a subsidy for solar panels.','Some people oppose subsidies for polluting industries.','The council discussed a transport subsidy for students.'), ('controversial','causing strong disagreement or debate','спорный, вызывающий разногласия','The new rule was controversial among parents.','Animal testing remains a controversial issue.','He made a controversial comment online.'), ('intimidate','to frighten or pressure someone so they do something','запугивать, устрашать','Nobody should intimidate a classmate.','The loud crowd tried to intimidate the speaker.','Report anyone who intimidates you online.'), ('initiative','a new plan or action intended to solve a problem','инициатива, начинание','Students started an initiative to clean the park.','The city’s tree-planting initiative needs volunteers.','Her initiative made the club more welcoming.'), ('vital','extremely important or necessary','жизненно важный, крайне важный','Clean water is vital for every community.','Sleep is vital before an exam.','Protecting forests is vital for wildlife.'), ('reverse','to change something so that it goes in the opposite direction','обратить вспять, изменить на противоположное','We must reverse the rise in plastic pollution.','Exercise can help reverse some unhealthy habits.','The team reversed its decision after listening to students.')] for i,(word,meaning,ru,e1,e2,e3) in enumerate(vocab,1): story += [KeepTogether([box(f'{i}. {word.upper()}',f'<b>English:</b> {meaning}<br/><b>Русский:</b> {ru}<br/><b>Everyday examples:</b> 1) {e1} 2) {e2} 3) {e3}', MINT if i%2 else SKY),Spacer(1,0.14*cm)])] story.append(PageBreak()) # speaking story += [P('5. Intensive Speaking Practice','h1x'),P('Use each question as a 60-90 second speaking task. First read the model answer. Then personalise it: add a reason, a real example, and a contrasting idea.', 'body')] qs=[ ('1. Which animal would you choose as the best pet for a busy family, and why?','I would choose a cat because it is usually more independent than a dog. A busy family still needs to provide attention, food, and vet care, but a cat can cope better with a short period alone. However, the right choice depends on the family’s lifestyle.'), ('2. Should people be allowed to keep wild animals as pets?','Generally, no. Wild animals have complex needs and may suffer in small homes. Keeping them can also support illegal trade. Exceptions might exist for trained conservation centres that protect animals and educate the public.'), ('3. Why do people enjoy animal stories in the news?','Animal stories often make serious news feel personal. A rescued pet can show kindness, while an extinction story can make environmental problems easier to understand. People also like stories with a hopeful ending.'), ('4. How can social media help an animal shelter?','It can share photos of animals that need homes and quickly reach local people. It can also collect donations and recruit volunteers. However, posts should be truthful, and people should check information before sharing it.'), ('5. Is it ethical to visit a cat cafe?','It can be ethical if the cats are healthy, have quiet spaces, and are not forced to interact with visitors. A good cat cafe may also help adoption. If animals look stressed or overcrowded, I would not support it.'), ('6. What is the biggest threat to wildlife near your home?','In many places, it is habitat loss caused by construction and traffic. Litter and pollution can make the problem worse. Local people can help by protecting green spaces and keeping parks clean.'), ('7. How would you persuade classmates not to abandon pets?','I would explain that a pet is a long-term responsibility, not a temporary toy. Before getting one, families should think about cost, time, holidays, and medical care. If a family has a problem, it should contact a shelter rather than abandon the animal.'), ('8. Should governments spend money on protecting endangered species?','Yes, because species are part of ecosystems that people depend on. Protecting a habitat can help many animals, plants, and local communities at the same time. Governments should spend money carefully and measure results.'), ('9. Is bullfighting culture, cruelty, or both?','It may be seen as a tradition by some people, but tradition does not automatically make an activity acceptable. I think animal suffering is too high a price for entertainment. Cultural events can change while still respecting history.'), ('10. What would you do if you found an injured wild animal?','I would keep a safe distance, especially if the animal could bite or carry disease. Then I would call a local rescue service, vet, or wildlife organisation. I would not try to feed it unless an expert gave instructions.'), ('11. Can scientific research involving animals ever be justified?','It is a difficult issue. It may be justified only when there is no reliable alternative, when the goal is important, and when suffering is reduced as much as possible. Researchers should be strictly monitored and should use alternatives whenever possible.'), ('12. Which is more effective: individual actions or government laws?','Both matter, but government laws can change systems faster. For example, laws can protect habitats or punish smugglers. Individual actions are still important because they influence shopping choices, community projects, and public opinion.'), ('13. How can schools make students care more about extinction?','Schools can connect the topic to real experiences. Students could create a wildlife garden, interview a conservation worker, or investigate local species. Projects are more memorable than simply memorising facts.'), ('14. Imagine your town wants to build on a forest. What questions would you ask?','I would ask which species live there, whether another location is possible, and how the project will affect water, noise, and traffic. I would also ask if local residents can see an environmental report before a decision is made.'), ('15. What headline about animals would you like to read in ten years?','I would like to read: “Endangered frog returns to protected forests.” It would mean that people had restored habitats, stopped illegal trade, and supported science. It would be a hopeful sign that environmental damage can be reversed.')] for q,a in qs: story += [box(q,f'<b>Model answer:</b> {a}', LILAC if int(q.split('.')[0])%2 else SKY),Spacer(1,0.13*cm)] story += [P('Final speaking formula','h2x'),box('POINT → REASON → EXAMPLE → BALANCE','<b>Point:</b> I believe... <b>Reason:</b> because... <b>Example:</b> For example... <b>Balance:</b> However, it depends on...<br/><br/>This pattern helps you sound organised, thoughtful, and B2+.',SUN),P('Source note: Content, vocabulary and exercise prompts are based on the supplied “Animals making headlines” pages. The grammar explanation is original, supported by the general principle that participle clauses provide a more economical form, as explained by the British Council LearnEnglish resource.', 'small')] doc=SimpleDocTemplate(OUT,pagesize=A4,rightMargin=1.7*cm,leftMargin=1.7*cm,topMargin=1.55*cm,bottomMargin=1.8*cm,title='Animal Headlines B2+ Handbook',author='Orris') doc.build(story,onFirstPage=footer,onLaterPages=footer) print(OUT) PY python "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" python -c "from pypdf import PdfReader; p='/tmp/workspace/animal-headlines-handbook/output/Animal_Headlines_B2_Handbook.pdf'; r=PdfReader(p); print('PAGES',len(r.pages)); print('TEXT_SAMPLE',r.pages[0].extract_text()[:300])"

Reading File
Running Command

python -c "p='/tmp/workspace/animal-headlines-handbook/src/create_handbook.py'; s=open(p).read(); s=s.replace(\"[0.8*cm,8.4*cm,8.1*cm]))\\nstory += [P('Exercise 8\",\"[0.8*cm,8.4*cm,8.1*cm])]\\nstory += [P('Exercise 8\"); open(p,'w').write(s)" && python -m py_compile "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python -c "from pypdf import PdfReader; p='/tmp/workspace/animal-headlines-handbook/output/Animal_Headlines_B2_Handbook.pdf'; r=PdfReader(p); print('PAGES',len(r.pages)); print('FIRST',r.pages[0].extract_text()[:180]); print('LAST',r.pages[-1].extract_text()[:180])"

Running Command

python -c "p='/tmp/workspace/animal-headlines-handbook/src/create_handbook.py'; lines=open(p).read().splitlines(True); out=[]; [out.append(x[:-2]+'\n' if x.lstrip().startswith('story +=') and x.rstrip().endswith('))') else x) for x in lines]; open(p,'w').writelines(out)" && python -m py_compile "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python -c "from pypdf import PdfReader; p='/tmp/workspace/animal-headlines-handbook/output/Animal_Headlines_B2_Handbook.pdf'; r=PdfReader(p); print('PAGES',len(r.pages)); print('FIRST',r.pages[0].extract_text()[:140]); print('LAST',r.pages[-1].extract_text()[-200:])"

Running Command

python -c "p='/tmp/workspace/animal-headlines-handbook/src/create_handbook.py'; s=open(p).read(); s=s.replace("])) ,PageBreak()", "]) ,PageBreak()") if False else s; s=s.replace("]], [10*cm,7.1*cm])),PageBreak()]","]], [10*cm,7.1*cm]),PageBreak()]"); open(p,'w').write(s)" && python -m py_compile "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python -c "from pypdf import PdfReader; p='/tmp/workspace/animal-headlines-handbook/output/Animal_Headlines_B2_Handbook.pdf'; r=PdfReader(p); print('PAGES',len(r.pages)); print('FIRST',r.pages[0].extract_text()[:140]); print('LAST',r.pages[-1].extract_text()[-200:])"

Running Command

python -c 'p="/tmp/workspace/animal-headlines-handbook/src/create_handbook.py"; s=open(p).read(); s=s.replace("]], [10*cm,7.1*cm])),PageBreak()]", "]], [10*cm,7.1*cm]),PageBreak()]"); open(p,"w").write(s)' && python -m py_compile "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python -c 'from pypdf import PdfReader; p="/tmp/workspace/animal-headlines-handbook/output/Animal_Headlines_B2_Handbook.pdf"; r=PdfReader(p); print("PAGES",len(r.pages)); print(r.pages[0].extract_text()[:100])'

Reading File
Running Command

python -c 'p="/tmp/workspace/animal-headlines-handbook/src/create_handbook.py"; ls=open(p).read().splitlines(); ls=[x+"]" if x.startswith("story += [") and x.endswith("])" ) else x for x in ls]; open(p,"w").write("\n".join(ls)+"\n")' && python -m py_compile "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python -c 'from pypdf import PdfReader; p="/tmp/workspace/animal-headlines-handbook/output/Animal_Headlines_B2_Handbook.pdf"; r=PdfReader(p); print("PAGES",len(r.pages)); print("CHECK", r.pages[0].extract_text()[:80], r.pages[-1].extract_text()[-100:])'

Running Command

python -c 'p="/tmp/workspace/animal-headlines-handbook/src/create_handbook.py"; s=open(p).read(); s=s.replace("name='title'", "name='mytitle'").replace("name='subtitle'", "name='mysubtitle'").replace("'title')", "'mytitle')").replace("'subtitle')", "'mysubtitle')"); open(p,"w").write(s)' && python -m py_compile "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python -c 'from pypdf import PdfReader; p="/tmp/workspace/animal-headlines-handbook/output/Animal_Headlines_B2_Handbook.pdf"; r=PdfReader(p); print("PAGES",len(r.pages)); print("FIRST",r.pages[0].extract_text()[:100]); print("LAST",r.pages[-1].extract_text()[-120:])'

Reading File
Running Command

sed -i "s/name='title'/name='mytitle'/; s/name='subtitle'/name='mysubtitle'/; s/'title')/'mytitle')/g; s/'subtitle')/'mysubtitle')/g" "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python -m py_compile "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python -c "from pypdf import PdfReader; p='/tmp/workspace/animal-headlines-handbook/output/Animal_Headlines_B2_Handbook.pdf'; r=PdfReader(p); print('PAGES',len(r.pages)); print('FIRST',r.pages[0].extract_text()[:100]); print('LAST',r.pages[-1].extract_text()[-120:])"

Running Command

python -c "import os,pdfplumber; p='/tmp/workspace/animal-headlines-handbook/output/Animal_Headlines_B2_Handbook.pdf'; print('SIZE',os.path.getsize(p)); pdf=pdfplumber.open(p); print('PAGES',len(pdf.pages)); [print(i+1, len(pg.extract_text() or ''), (pg.extract_text() or '')[:55].replace('\\n',' | ')) for i,pg in enumerate(pdf.pages)]"

Created a 12-page colorful B2+ handbook based on the attached “Animals Making Headlines” materials.
It includes:
  • Individual answers and model responses for all exercises visible in the attachment
  • Easy, creative explanations of participle clauses and relative clauses
  • A clear “Participle Clauses vs Relative Clauses” comparison
  • 12 B2+ vocabulary entries with English definitions, Russian translations, and three daily-life examples each
  • 15 intensive speaking questions with B2+ model answers
  • A note identifying exercises that refer to source pages not included in the attachment, with appropriate model answers provided

Animal Headlines B2 Handbook

PDF Document · PDF

The Russian translation is not visible under sentences for vocabulary , please add

Browsing Directory

~/

Reading File
Reading File
Reading File
Running Command

fc-match -f '%{file}\n' 'DejaVu Sans' | head -1

Running Command

python -c "import os; print(os.path.exists('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf')); print(os.path.exists('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf'))"

Running Command

python -c 'p="/tmp/workspace/animal-headlines-handbook/src/create_handbook.py"; s=open(p).read(); s=s.replace("from reportlab.pdfbase import pdfmetrics", "from reportlab.pdfbase import pdfmetrics\nfrom reportlab.pdfbase.ttfonts import TTFont\npdfmetrics.registerFont(TTFont(\"NotoSans\", \"/usr/share/fonts/google-noto-vf/NotoSans[wght].ttf\"))"); s=s.replace("fontName=\'Helvetica\'", "fontName=\'NotoSans\'").replace("fontName=\'Helvetica-Bold\'", "fontName=\'NotoSans\'"); old="for i,(word,meaning,ru,e1,e2,e3) in enumerate(vocab,1):\n story += [KeepTogether([box(f\'{i}. {word.upper()}\',f\'<b>English:</b> {meaning}<br/><b>Русский:</b> {ru}<br/><b>Everyday examples:</b> 1) {e1} 2) {e2} 3) {e3}\', MINT if i%2 else SKY),Spacer(1,0.14*cm)])]"; new="ru_examples=[(\"Мы нашли брошенный велосипед возле станции.\",\"Приют заботится о брошенных кошках.\",\"Никогда не оставляйте бесхозную сумку в общественном месте.\"),(\"Небольшой магазин избежал банкротства после онлайн-кампании.\",\"Высокие расходы приблизили компанию к банкротству.\",\"Владелец честно рассказал о риске банкротства.\"),(\"Наш текущий проект - сократить пластиковые отходы.\",\"Учитель давал обратную связь во время продолжающегося эксперимента.\",\"Продолжается обсуждение школьной формы.\"),(\"Динозавры вымерли, но сегодня многие виды находятся под угрозой.\",\"Утрата среды обитания может привести к вымиранию.\",\"В музее проходит выставка о вымерших животных.\"),(\"Пруд - важная среда обитания для лягушек.\",\"Строительство дорог может разрушить среду обитания животных.\",\"Мы создали среду обитания для птиц в школьном саду.\"),(\"Полиция остановила контрабандиста в аэропорту.\",\"Контрабандисты, торгующие дикими животными, вредят редким видам.\",\"Фильм был о контрабандисте, который перевозил украденные произведения искусства.\"),(\"Ферма получила субсидию на солнечные панели.\",\"Некоторые люди выступают против субсидий загрязняющим отраслям.\",\"Совет обсудил транспортную субсидию для учеников.\"),(\"Новое правило вызвало разногласия среди родителей.\",\"Тестирование на животных остаётся спорной темой.\",\"Он сделал спорный комментарий в интернете.\"),(\"Никто не должен запугивать одноклассника.\",\"Шумная толпа пыталась запугать выступающего.\",\"Сообщайте о тех, кто запугивает вас в интернете.\"),(\"Ученики начали инициативу по уборке парка.\",\"Городской инициативе по посадке деревьев нужны волонтёры.\",\"Её инициатива сделала клуб более дружелюбным.\"),(\"Чистая вода жизненно важна для каждого сообщества.\",\"Сон жизненно важен перед экзаменом.\",\"Защита лесов жизненно важна для дикой природы.\"),(\"Мы должны обратить вспять рост пластикового загрязнения.\",\"Физические упражнения могут помочь изменить некоторые нездоровые привычки.\",\"Команда отменила своё решение после того, как выслушала учеников.\")]\nfor i,(word,meaning,ru,e1,e2,e3) in enumerate(vocab,1):\n r1,r2,r3=ru_examples[i-1]\n text=f\'<b>English:</b> {meaning}<br/><b>Русский:</b> {ru}<br/><b>Everyday examples:</b><br/>1) {e1}<br/><font name=\"NotoSans\"><i>Русский:</i> {r1}</font><br/>2) {e2}<br/><font name=\"NotoSans\"><i>Русский:</i> {r2}</font><br/>3) {e3}<br/><font name=\"NotoSans\"><i>Русский:</i> {r3}</font>\'\n story += [KeepTogether([box(f\'{i}. {word.upper()}\',text, MINT if i%2 else SKY),Spacer(1,0.14*cm)])]"; assert old in s, "replacement target not found"; s=s.replace(old,new); open(p,"w").write(s)' && python -m py_compile "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python -c "from pypdf import PdfReader; p='/tmp/workspace/animal-headlines-handbook/output/Animal_Headlines_B2_Handbook.pdf'; r=PdfReader(p); print('PAGES',len(r.pages)); txt=''.join(x.extract_text() or '' for x in r.pages); print('Russian-check', 'Мы нашли брошенный велосипед' in txt, 'Русский:' in txt)"

Writing File

~/animal-headlines-handbook/src/update_russian.py

from pathlib import Path
p = Path('/tmp/workspace/animal-headlines-handbook/src/create_handbook.py')
s = p.read_text()
s = s.replace("from reportlab.pdfbase import pdfmetrics\n", "from reportlab.pdfbase import pdfmetrics\npdfmetrics.registerFont(TTFont('NotoSans', '/usr/share/fonts/google-noto-vf/NotoSans[wght].ttf'))\n")
s = s.replace("fontName='Helvetica-Bold'", "fontName='NotoSans'")
s = s.replace("fontName='Helvetica'", "fontName='NotoSans'")
start = s.index("for i,(word,meaning,ru,e1,e2,e3) in enumerate(vocab,1):")
end = s.index("story.append(PageBreak())", start)
new = '''ru_examples=[
('Мы нашли брошенный велосипед возле станции.','Приют заботится о брошенных кошках.','Никогда не оставляйте бесхозную сумку в общественном месте.'),
('Небольшой магазин избежал банкротства после онлайн-кампании.','Высокие расходы приблизили компанию к банкротству.','Владелец честно рассказал о риске банкротства.'),
('Наш текущий проект - сократить пластиковые отходы.','Учитель давал обратную связь во время продолжающегося эксперимента.','Продолжается обсуждение школьной формы.'),
('Динозавры вымерли, но сегодня многие виды находятся под угрозой.','Утрата среды обитания может привести к вымиранию.','В музее проходит выставка о вымерших животных.'),
('Пруд - важная среда обитания для лягушек.','Строительство дорог может разрушить среду обитания животных.','Мы создали среду обитания для птиц в школьном саду.'),
('Полиция остановила контрабандиста в аэропорту.','Контрабандисты, торгующие дикими животными, вредят редким видам.','Фильм был о контрабандисте, который перевозил украденные произведения искусства.'),
('Ферма получила субсидию на солнечные панели.','Некоторые люди выступают против субсидий загрязняющим отраслям.','Совет обсудил транспортную субсидию для учеников.'),
('Новое правило вызвало разногласия среди родителей.','Тестирование на животных остаётся спорной темой.','Он сделал спорный комментарий в интернете.'),
('Никто не должен запугивать одноклассника.','Шумная толпа пыталась запугать выступающего.','Сообщайте о тех, кто запугивает вас в интернете.'),
('Ученики начали инициативу по уборке парка.','Городской инициативе по посадке деревьев нужны волонтёры.','Её инициатива сделала клуб более дружелюбным.'),
('Чистая вода жизненно важна для каждого сообщества.','Сон жизненно важен перед экзаменом.','Защита лесов жизненно важна для дикой природы.'),
('Мы должны обратить вспять рост пластикового загрязнения.','Физические упражнения могут помочь изменить некоторые нездоровые привычки.','Команда отменила своё решение после того, как выслушала учеников.')]
for i,(word,meaning,ru,e1,e2,e3) in enumerate(vocab,1):
    r1,r2,r3=ru_examples[i-1]
    text=(f'<b>English:</b> {meaning}<br/><b>Русский:</b> {ru}<br/>'
          f'<b>Everyday examples:</b><br/>1) {e1}<br/><i>Русский:</i> {r1}<br/>'
          f'2) {e2}<br/><i>Русский:</i> {r2}<br/>'
          f'3) {e3}<br/><i>Русский:</i> {r3}')
    story += [KeepTogether([box(f'{i}. {word.upper()}',text, MINT if i%2 else SKY),Spacer(1,0.14*cm)])]
'''
s = s[:start] + new + s[end:]
p.write_text(s)
print('Updated source')
Running Command

python "/tmp/workspace/animal-headlines-handbook/src/update_russian.py" && python -m py_compile "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python "/tmp/workspace/animal-headlines-handbook/src/create_handbook.py" && python -c "from pypdf import PdfReader; p='/tmp/workspace/animal-headlines-handbook/output/Animal_Headlines_B2_Handbook.pdf'; r=PdfReader(p); text=''.join(page.extract_text() or '' for page in r.pages); print('PAGES=',len(r.pages)); print('RUSSIAN_SENTENCES_PRESENT=', 'Мы нашли брошенный велосипед' in text); print('FONT_CHECK=', 'Русский:' in text)"

Browsing Directory

~/animal-headlines-handbook/output

Updated the handbook. Each vocabulary example now has its Russian translation directly underneath it, using a Cyrillic-compatible font.

Animal Headlines B2 Handbook

PDF Document · PDF

This is a shared conversation. Sign in to Orris to start your own chat.